当前位置:首页 > 技术 > 正文内容

Apache Commons 实用工具库概览与代码示例

访客 技术 2026年6月5日 1

Apache Commons 项目为 Java 开发提供了大量经过实战检验的开源工具库,旨在简化常见编程任务,提升开发效率。本文梳理了其中多个核心组件的功能,并附上简洁的代码片段,帮助快速上手。

核心组件概要

库名功能简介
commons-beanutils操作 JavaBean,如属性复制、对象克隆、Map 与 Bean 互转
commons-betwixtXML 与 Java 对象之间的序列化与反序列化
commons-codec常用编码解码实现,如 Base64、Hex、MD5、URL 编码等
commons-collections扩展 Java 集合框架,提供双向 Map、有序 Map、集合操作工具等
commons-compress支持多种格式的压缩、打包、解压操作
commons-configuration统一管理多种来源的配置(Properties、XML、JNDI 等)
commons-dbcp基于连接池的数据库连接管理,Tomcat 内置数据源即基于此
commons-dbutils轻量级 JDBC 封装,简化查询、结果集映射到 List 或 JavaBean
commons-email封装 JavaMail,简化邮件发送
commons-fileupload处理 HTTP 文件上传请求
commons-httpclientHTTP 客户端,支持 GET/POST、认证、连接管理等(新项目建议用 HttpClient 4.x 或 5.x)
commons-ioIO 流工具,简化文件读写、流复制、临时文件管理等
commons-lang核心语言增强工具,如字符串操作、数组操作、日期处理、随机数等
commons-logging日志门面接口,运行时绑定具体日志实现
commons-validator提供日期、正则表达式等数据验证框架

Maven 依赖参考

以下为各组件在 Maven 项目中的典型依赖声明(版本号请根据实际需求选择最新稳定版):

<!-- BeanUtils -->
<dependency>
    <groupId>commons-beanutils</groupId>
    <artifactId>commons-beanutils</artifactId>
    <version>1.9.4</version>
</dependency>

<!-- Betwixt -->
<dependency>
    <groupId>commons-betwixt</groupId>
    <artifactId>commons-betwixt</artifactId>
    <version>0.8</version>
</dependency>

<!-- Codec -->
<dependency>
    <groupId>commons-codec</groupId>
    <artifactId>commons-codec</artifactId>
    <version>1.15</version>
</dependency>

<!-- Collections4 -->
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-collections4</artifactId>
    <version>4.4</version>
</dependency>

<!-- Compress -->
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-compress</artifactId>
    <version>1.21</version>
</dependency>

<!-- Configuration2 -->
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-configuration2</artifactId>
    <version>2.8.0</version>
</dependency>

<!-- DBCP2 -->
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-dbcp2</artifactId>
    <version>2.9.0</version>
</dependency>

<!-- DbUtils -->
<dependency>
    <groupId>commons-dbutils</groupId>
    <artifactId>commons-dbutils</artifactId>
    <version>1.7</version>
</dependency>

<!-- Email -->
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-email</artifactId>
    <version>1.5</version>
</dependency>

<!-- FileUpload -->
<dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    <version>1.4</version>
</dependency>

<!-- HttpClient (推荐使用 4.x 或 5.x) -->
<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>4.5.13</version>
</dependency>

<!-- IO -->
<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.11.0</version>
</dependency>

<!-- Lang3 -->
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.12.0</version>
</dependency>

<!-- Logging -->
<dependency>
    <groupId>commons-logging</groupId>
    <artifactId>commons-logging</artifactId>
    <version>1.2</version>
</dependency>

<!-- Validator -->
<dependency>
    <groupId>commons-validator</groupId>
    <artifactId>commons-validator</artifactId>
    <version>1.7</version>
</dependency>

1. commons-beanutils - Bean 操作

支持对象克隆、Map 到 Bean 的填充、属性获取/设置等。

import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.PropertyUtils;
import java.util.HashMap;
import java.util.Map;

public class BeanUtilsDemo {
    public static void main(String[] args) throws Exception {
        // 克隆对象
        User user = new User("Alice", 30);
        User cloned = (User) BeanUtils.cloneBean(user);
        System.out.println(cloned.getName() + ", " + cloned.getAge());

        // Map 填充到 Bean
        Map<String, String> data = new HashMap<>();
        data.put("name", "Bob");
        data.put("email", "bob@example.com");
        data.put("age", "25");
        User target = new User();
        BeanUtils.populate(target, data);

        // Bean 转 Map
        Map<String, String> beanMap = BeanUtils.describe(target);
        System.out.println(beanMap.get("name"));

        // 反射调用 get/set
        String nameVal = (String) PropertyUtils.getProperty(target, "name");
        PropertyUtils.setProperty(target, "age", 28);
        System.out.println(target.getAge());
    }

    public static class User {
        private String name;
        private int age;
        private String email;
        // getters & setters 省略
    }
}

2. commons-betwixt - XML 与 Java 互转

将 JavaBean 序列化为 XML 文档,或从 XML 恢复为 Bean。

import org.apache.commons.betwixt.io.BeanReader;
import org.apache.commons.betwixt.io.BeanWriter;
import java.io.StringReader;
import java.io.StringWriter;

public class BetwixtDemo {
    public static void main(String[] args) throws Exception {
        // Bean -> XML
        StringWriter writer = new StringWriter();
        writer.write("<?xml version='1.0' encoding='UTF-8' ?>\n");
        BeanWriter beanWriter = new BeanWriter(writer);
        beanWriter.getXMLIntrospector().getConfiguration().setAttributesForPrimitives(false);
        beanWriter.getBindingConfiguration().setMapIDs(false);
        beanWriter.enablePrettyPrint();
        beanWriter.write("person", new Person("John", 25));
        System.out.println(writer.toString());

        // XML -> Bean
        String xml = "<person><name>Jane</name><age>32</age></person>";
        BeanReader reader = new BeanReader();
        reader.getXMLIntrospector().getConfiguration().setAttributesForPrimitives(false);
        reader.getBindingConfiguration().setMapIDs(false);
        reader.registerBeanClass("person", Person.class);
        Person p = (Person) reader.parse(new StringReader(xml));
        System.out.println(p.getName());
    }

    // 假设存在 Person 类(name, age 属性及 getter/setter)
}

3. commons-codec - 编码解码

提供 Base64、MD5、SHA、URL 编码等常用算法。

import org.apache.commons.codec.binary.Base64;
import org.apache.commons.codec.digest.DigestUtils;

public class CodecDemo {
    public static void main(String[] args) {
        // Base64 编码
        String original = "hello world";
        String encoded = Base64.encodeBase64String(original.getBytes());
        System.out.println("Base64: " + encoded);

        // Base64 解码
        String decoded = new String(Base64.decodeBase64(encoded));
        System.out.println("Decoded: " + decoded);

        // MD5 散列
        String md5Hex = DigestUtils.md5Hex(original);
        System.out.println("MD5: " + md5Hex);
    }
}

4. commons-collections - 集合增强

提供有序 Map、双向 Map、集合交集/并集等。

import org.apache.commons.collections4.BidiMap;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.collections4.bidimap.TreeBidiMap;
import org.apache.commons.collections4.map.LinkedMap;
import java.util.Arrays;
import java.util.List;

public class CollectionsDemo {
    public static void main(String[] args) {
        // 有序 Map
        LinkedMap<String, String> linkedMap = new LinkedMap<>();
        linkedMap.put("ONE", "1");
        linkedMap.put("TWO", "2");
        linkedMap.put("THREE", "3");
        System.out.println(linkedMap.nextKey("ONE")); // TWO

        // 双向 Map
        BidiMap<String, String> bidi = new TreeBidiMap<>();
        bidi.put("X", "10");
        System.out.println(bidi.get("X"));    // 10
        System.out.println(bidi.getKey("10")); // X

        // 集合交集
        List<Integer> a = Arrays.asList(1, 2, 3, 4);
        List<Integer> b = Arrays.asList(3, 4, 5);
        List<Integer> intersection = (List<Integer>) CollectionUtils.retainAll(a, b);
        System.out.println(intersection); // [3, 4]
    }
}

5. commons-compress - 压缩与打包

支持 ZIP、TAR、GZIP 等格式。

import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
import org.apache.commons.compress.archivers.zip.ZipArchiveOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;

public class CompressDemo {
    public static void main(String[] args) throws Exception {
        File source = new File("/path/to/myfile.txt");
        File zipTarget = new File("/path/to/output.zip");

        try (ZipArchiveOutputStream zos = new ZipArchiveOutputStream(new FileOutputStream(zipTarget));
             FileInputStream fis = new FileInputStream(source)) {
            ZipArchiveEntry entry = new ZipArchiveEntry(source.getName());
            zos.putArchiveEntry(entry);
            byte[] buffer = new byte[1024];
            int len;
            while ((len = fis.read(buffer)) != -1) {
                zos.write(buffer, 0, len);
            }
            zos.closeArchiveEntry();
        }
    }
}

6. commons-configuration - 配置管理

从多种源加载配置:Properties、XML、环境变量等。

import org.apache.commons.configuration2.PropertiesConfiguration;
import org.apache.commons.configuration2.builder.FileBasedConfigurationBuilder;
import org.apache.commons.configuration2.builder.fluent.Parameters;

public class ConfigurationDemo {
    public static void main(String[] args) throws Exception {
        Parameters params = new Parameters();
        FileBasedConfigurationBuilder<PropertiesConfiguration> builder =
                new FileBasedConfigurationBuilder<>(PropertiesConfiguration.class)
                        .configure(params.properties().setFileName("app.properties"));
        PropertiesConfiguration config = builder.getConfiguration();
        String dbUrl = config.getString("database.url");
        System.out.println("DB URL: " + dbUrl);
        // 修改并保存
        config.setProperty("app.version", "2.0");
        builder.save();
    }
}

7. commons-dbcp - 数据库连接池

构建标准 JDBC 数据源。

import org.apache.commons.dbcp2.BasicDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;

public class DbcpDemo {
    public static DataSource createDataSource() {
        BasicDataSource ds = new BasicDataSource();
        ds.setDriverClassName("com.mysql.cj.jdbc.Driver");
        ds.setUrl("jdbc:mysql://localhost:3306/testdb");
        ds.setUsername("root");
        ds.setPassword("password");
        ds.setInitialSize(5);
        ds.setMaxTotal(10);
        return ds;
    }

    public static void main(String[] args) throws Exception {
        DataSource ds = createDataSource();
        try (Connection conn = ds.getConnection();
             Statement stmt = conn.createStatement();
             ResultSet rs = stmt.executeQuery("SELECT id, name FROM users")) {
            while (rs.next()) {
                System.out.println(rs.getInt("id") + ": " + rs.getString("name"));
            }
        }
    }
}

8. commons-dbutils - JDBC 轻量封装

简化查询与结果集映射。

import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.MapListHandler;
import java.sql.Connection;
import java.sql.DriverManager;
import java.util.List;
import java.util.Map;

public class DbUtilsDemo {
    public static void main(String[] args) throws Exception {
        String url = "jdbc:mysql://localhost:3306/testdb";
        Connection conn = DriverManager.getConnection(url, "root", "password");
        QueryRunner runner = new QueryRunner();

        // 映射为 Bean 列表
        List<User> users = runner.query(conn, "SELECT * FROM users", new BeanListHandler<>(User.class));
        users.forEach(u -> System.out.println(u.getName()));

        // 映射为 Map 列表
        List<Map<String, Object>> rows = runner.query(conn, "SELECT name, age FROM users", new MapListHandler());
        rows.forEach(m -> System.out.println(m.get("name")));

        conn.close();
    }
}

9. commons-email - 邮件发送

封装 JavaMail,支持简单文本、HTML、附件等邮件。

import org.apache.commons.mail.DefaultAuthenticator;
import org.apache.commons.mail.Email;
import org.apache.commons.mail.SimpleEmail;

public class EmailDemo {
    public static void main(String[] args) throws Exception {
        Email email = new SimpleEmail();
        email.setHostName("smtp.gmail.com");
        email.setSmtpPort(465);
        email.setAuthenticator(new DefaultAuthenticator("your@gmail.com", "app-password"));
        email.setSSLOnConnect(true);
        email.setFrom("your@gmail.com");
        email.setSubject("Hello from Commons Email");
        email.setMsg("This is a test message.");
        email.addTo("recipient@example.com");
        email.send();
    }
}

10. commons-fileupload - 文件上传

解析 multipart 请求,处理上传文件。

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.util.List;

public class FileUploadHandler {
    public void handleUpload(HttpServletRequest request) throws Exception {
        if (!ServletFileUpload.isMultipartContent(request)) {
            return;
        }
        DiskFileItemFactory factory = new DiskFileItemFactory();
        factory.setSizeThreshold(1024 * 1024); // 1 MB 内存阈值
        factory.setRepository(new File("/tmp/upload-temp"));

        ServletFileUpload upload = new ServletFileUpload(factory);
        upload.setSizeMax(10 * 1024 * 1024); // 最大 10 MB

        List<FileItem> items = upload.parseRequest(request);
        for (FileItem item : items) {
            if (item.isFormField()) {
                String fieldName = item.getFieldName();
                String value = item.getString();
                // 处理普通表单字段
            } else {
                String fileName = item.getName();
                File uploadedFile = new File("/uploads/" + fileName);
                item.write(uploadedFile);
            }
        }
    }
}

11. commons-httpclient - HTTP 客户端

执行 GET/POST 请求,支持重定向、状态管理。(建议升级到 HttpComponents 4.x/5.x)

import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;

public class HttpClientDemo {
    public static void main(String[] args) throws Exception {
        try (CloseableHttpClient client = HttpClients.createDefault()) {
            HttpGet request = new HttpGet("https://httpbin.org/get");
            HttpResponse response = client.execute(request);
            String body = EntityUtils.toString(response.getEntity());
            System.out.println("Response: " + body);
        }
    }
}

12. commons-io - IO 工具

简化文件、流、字节数组操作。

import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
import java.io.File;
import java.io.InputStream;
import java.net.URL;
import java.util.List;

public class IODemo {
    public static void main(String[] args) throws Exception {
        // 读取文件所有行
        File file = new File("/path/to/file.txt");
        List<String> lines = FileUtils.readLines(file, "UTF-8");

        // 从 URL 读取字符串
        try (InputStream in = new URL("https://example.com").openStream()) {
            String content = IOUtils.toString(in, "UTF-8");
            System.out.println(content.substring(0, 100));
        }

        // 复制文件
        FileUtils.copyFile(new File("source.txt"), new File("dest.txt"));
    }
}

13. commons-lang3 - 核心增强

字符串、数组、日期、随机数等工具。

import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.RandomStringUtils;
import org.apache.commons.lang3.time.DateFormatUtils;
import org.apache.commons.lang3.time.DateUtils;
import java.util.Date;

public class Lang3Demo {
    public static void main(String[] args) {
        // 数组合并
        String[] arr1 = {"a", "b"};
        String[] arr2 = {"c", "d"};
        String[] merged = ArrayUtils.addAll(arr1, arr2);

        // 字符串判断空
        System.out.println(StringUtils.isBlank("   "));  // true

        // 截取子串
        String after = StringUtils.substringAfter("SELECT * FROM person", "FROM");
        System.out.println(after.trim());

        // 随机字母数字
        System.out.println(RandomStringUtils.randomAlphanumeric(8));

        // 日期格式化
        System.out.println(DateFormatUtils.format(new Date(), "yyyy-MM-dd HH:mm:ss"));

        // 日期加减
        Date tomorrow = DateUtils.addDays(new Date(), 1);
        System.out.println(tomorrow);
    }
}

14. commons-logging - 日志门面

运行时自动绑定 Log4j、JDK Logging 等实现。

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

public class LoggingDemo {
    private static final Log log = LogFactory.getLog(LoggingDemo.class);

    public static void main(String[] args) {
        log.trace("trace message");
        log.debug("debug message");
        log.info("info message");
        log.warn("warn message");
        log.error("error message");
    }
}

15. commons-validator - 数据验证

提供日期、正则表达式、URL 等验证器。

import org.apache.commons.validator.routines.DateValidator;
import org.apache.commons.validator.routines.RegexValidator;

public class ValidatorDemo {
    public static void main(String[] args) {
        // 日期验证
        DateValidator dateValidator = DateValidator.getInstance();
        java.util.Date dt = dateValidator.validate("2023-12-25", "yyyy-MM-dd");
        if (dt != null) {
            System.out.println("Valid date: " + dt);
        }

        // 正则验证
        RegexValidator regex = new RegexValidator("^[A-Za-z0-9]+$");
        boolean valid = regex.isValid("Hello123");
        System.out.println("String valid: " + valid); // true
    }
}
标签: Apache Commons

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。