Apache Commons 实用工具库概览与代码示例
Apache Commons 项目为 Java 开发提供了大量经过实战检验的开源工具库,旨在简化常见编程任务,提升开发效率。本文梳理了其中多个核心组件的功能,并附上简洁的代码片段,帮助快速上手。
核心组件概要
| 库名 | 功能简介 |
|---|---|
| commons-beanutils | 操作 JavaBean,如属性复制、对象克隆、Map 与 Bean 互转 |
| commons-betwixt | XML 与 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-httpclient | HTTP 客户端,支持 GET/POST、认证、连接管理等(新项目建议用 HttpClient 4.x 或 5.x) |
| commons-io | IO 流工具,简化文件读写、流复制、临时文件管理等 |
| 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
}
}