Hutool是一个小而全的Java工具类库,它通过静态方法封装,降低了相关API的学习成本,提高了工作效率,使Java拥有函数式语言般的优雅。以下是关于Hutool的详细介绍:
一、基本信息
- 名称:Hutool
- 寓意:Hu(谐音"糊涂") + tool,寓意追求"万事都作糊涂观,无所谓失,无所谓得"的境界。
- 开发者:由国内开发者林智能(looly)开发并维护。
- 版本:截至当前时间(2024年08月08日),最新版本可能有所更新,但可参考的版本如v5.8.29等。
二、功能特点
- 简洁易用:提供简单而一致的API,使开发者能够快速上手并提高开发效率。
- 功能丰富:涵盖了Java开发底层代码中的方方面面,包括但不限于文件、流、加密解密、转码、正则、线程、XML等,并组成各种Util工具类。
- 高性能:在实现上注重性能优化,采用高效的算法和数据结构,处理大规模数据和高并发场景表现出色。
- 可靠稳定:经过广泛测试和实际应用验证,具有良好的稳定性和可靠性。
三、核心模块
- 日期时间操作:提供方便的日期时间操作方法,支持日期格式化、解析、计算、比较等。
- 加密解密:支持常见的加密解密算法,如MD5、SHA1、AES、DES等,通过简单的API调用实现数据的加密和解密。
- 文件操作:提供文件读写、复制、移动、删除等操作的方法,方便开发者进行文件管理和处理。
- 网络通信:封装了HTTP客户端和服务端的操作方法,支持HTTP请求发送和接收,简化了网络通信的实现。
- 类型转换:提供了一整套的类型转换解决方案,并通过ConverterRegistry工厂类自定义转换。
- 字符串处理:提供丰富的字符串处理方法,如判断字符串是否为空、截取、拼接、格式化等。
四、使用示例
在Maven项目中,只需在pom.xml
文件中添加Hutool的依赖即可使用。例如:
XML
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>最新版本号</version> <!-- 请替换为实际使用的版本号 -->
</dependency>
使用示例(字符串处理):
java
import cn.hutool.core.util.StrUtil;
public class HutoolExample {
public static void main(String[] args) {
String str = "Hello, Hutool!";
System.out.println(StrUtil.isEmpty(str)); // 判断字符串是否为空
System.out.println(StrUtil.sub(str, 0, 5)); // 截取字符串
}
}
使用示例(文件读写):
java
//默认UTF-8编码,可以在构造中传入第二个参数做为编码
FileReader fileReader = new FileReader("test.properties");
String result = fileReader.readString();
//获取文件类型
File file = FileUtil.file("d:/test.jpg");
String type = FileTypeUtil.getType(file);
//文件内容追加
FileAppender appender = new FileAppender(file, 16, true);
appender.append("123");
appender.append("abc");
appender.append("xyz");
使用示例(压缩包处理):
java
//将aaa目录下的所有文件目录打包到d:/aaa.zip
ZipUtil.zip("d:/aaa");
//将aaa目录下的所有文件目录打包到d:/bbb/目录下的aaa.zip文件中
// 此处第二个参数必须为文件,不能为目录
ZipUtil.zip("d:/aaa", "d:/bbb/aaa.zip");
//将aaa目录下的所有文件目录打包到d:/bbb/目录下的ccc.zip文件中
ZipUtil.zip("d:/aaa", "d:/bbb/ccc.zip");
//将aaa目录以及其目录下的所有文件目录打包到d:/bbb/目录下的ccc.zip文件中
ZipUtil.zip("d:/aaa", "d:/bbb/ccc.zip", true);
//将test.zip解压到e:\\aaa目录下,返回解压到的目录
File unzip = ZipUtil.unzip("E:\\aaa\\test.zip", "e:\\aaa");
使用示例(信息脱敏):
java
// 身份证 5***************1X
DesensitizedUtil.idCardNum("51343620000320711X", 1, 2);
// 手机号 180****1999
DesensitizedUtil.mobilePhone("18049531999");
使用示例(http请求):
java
// 最简单的HTTP请求,可以自动通过header等信息判断编码,不区分HTTP和HTTPS
String result1= HttpUtil.get("https://www.baidu.com");
// 当无法识别页面编码的时候,可以自定义请求页面的编码
String result2= HttpUtil.get("https://www.baidu.com", CharsetUtil.CHARSET_UTF_8);
//可以单独传入http参数,这样参数会自动做URL编码,拼接在URL中
HashMap<String, Object> paramMap = new HashMap<>();
paramMap.put("city", "北京");
String result3= HttpUtil.get("https://www.baidu.com", paramMap);
//post请求
HashMap<String, Object> paramMap = new HashMap<>();
paramMap.put("city", "北京");
String result= HttpUtil.post("https://www.baidu.com", paramMap);
//文件上传
HashMap<String, Object> paramMap = new HashMap<>();
//文件上传只需将参数中的键指定(默认file),值设为文件对象即可,对于使用者来说,文件上传与普通表单提交并无区别
paramMap.put("file", FileUtil.file("D:\\face.jpg"));
String result= HttpUtil.post("https://www.baidu.com", paramMap);
//文件下载
String fileUrl = "http://mirrors.sohu.com/centos/8.4.2105/isos/x86_64/CentOS-8.4.2105-x86_64-dvd1.iso";
//将文件下载后保存在E盘,返回结果为下载文件大小
long size = HttpUtil.downloadFile(fileUrl, FileUtil.file("e:/"));
System.out.println("Download size: " + size);
使用示例(表达式执行):
java
ExpressionEngine engine = new JexlEngine();
final Dict dict = Dict.create()
.set("a", 100.3)
.set("b", 45)
.set("c", -199.100);
// -143.8
final Object eval = engine.eval("a-(b-c)", dict);
使用示例(数据库操作):
java
Connection conn = null;
try {
conn = ds.getConnection();
// 执行非查询语句,返回影响的行数
int count = SqlExecutor.execute(conn, "UPDATE " + TABLE_NAME + " set field1 = ? where id = ?", 0, 0);
log.info("影响行数:{}", count);
// 执行非查询语句,返回自增的键,如果有多个自增键,只返回第一个
Long generatedKey = SqlExecutor.executeForGeneratedKey(conn, "UPDATE " + TABLE_NAME + " set field1 = ? where id = ?", 0, 0);
log.info("主键:{}", generatedKey);
/* 执行查询语句,返回实体列表,一个Entity对象表示一行的数据,Entity对象是一个继承自HashMap的对象,存储的key为字段名,value为字段值 */
List<Entity> entityList = SqlExecutor.query(conn, "select * from " + TABLE_NAME + " where param1 = ?", new EntityListHandler(), "值");
log.info("{}", entityList);
} catch (SQLException e) {
Log.error(log, e, "SQL error!");
} finally {
DbUtil.close(conn);
使用示例(邮件发送):
java
//发送普通文本邮件
MailUtil.send("hutool@foxmail.com", "测试", "邮件来自Hutool测试", false);
//发送HTML格式的邮件并附带附件
MailUtil.send("hutool@foxmail.com", "测试", "<h1>邮件来自Hutool测试</h1>", true, FileUtil.file("d:/aaa.xml"));
//群发邮件
ArrayList<String> tos = CollUtil.newArrayList(
"person1@bbb.com",
"person2@bbb.com",
"person3@bbb.com",
"person4@bbb.com");
MailUtil.send(tos, "测试", "邮件来自Hutool群发测试", false);
使用示例(excel写入处理):
java
List<String> row1 = CollUtil.newArrayList("aa", "bb", "cc", "dd");
List<String> row2 = CollUtil.newArrayList("aa1", "bb1", "cc1", "dd1");
List<String> row3 = CollUtil.newArrayList("aa2", "bb2", "cc2", "dd2");
List<String> row4 = CollUtil.newArrayList("aa3", "bb3", "cc3", "dd3");
List<String> row5 = CollUtil.newArrayList("aa4", "bb4", "cc4", "dd4");
List<List<String>> rows = CollUtil.newArrayList(row1, row2, row3, row4, row5);
//通过工具类创建writer
ExcelWriter writer = ExcelUtil.getWriter("d:/writeTest.xlsx");
//通过构造方法创建writer
//ExcelWriter writer = new ExcelWriter("d:/writeTest.xls");
//跳过当前行,既第一行,非必须,在此演示用
writer.passCurrentRow();
//合并单元格后的标题行,使用默认标题样式
writer.merge(row1.size() - 1, "测试标题");
//一次性写出内容,强制输出标题
writer.write(rows, true);
//关闭writer,释放内存
writer.close();
使用示例(word写入处理):
java
Word07Writer writer = new Word07Writer();
// 添加段落(标题)
writer.addText(new Font("方正小标宋简体", Font.PLAIN, 22), "我是第一部分", "我是第二部分");
// 添加段落(正文)
writer.addText(new Font("宋体", Font.PLAIN, 22), "我是正文第一部分", "我是正文第二部分");
// 写出到文件
writer.flush(FileUtil.file("e:/wordWrite.docx"));
// 关闭
writer.close();
使用示例(图片处理):
java
//图片缩放
ImgUtil.scale(
FileUtil.file("d:/face.jpg"),
FileUtil.file("d:/face_result.jpg"),
0.5f//缩放比例
);
//图片裁剪
ImgUtil.cut(
FileUtil.file("d:/face.jpg"),
FileUtil.file("d:/face_result.jpg"),
new Rectangle(200, 200, 100, 100)//裁剪的矩形区域
);
//类型转换
ImgUtil.convert(FileUtil.file("e:/test2.png"), FileUtil.file("e:/test2Convert.jpg"));
//添加水印
ImgUtil.pressText(//
FileUtil.file("e:/pic/face.jpg"), //
FileUtil.file("e:/pic/test2_result.png"), //
"版权所有", Color.WHITE, //文字
new Font("黑体", Font.BOLD, 100), //字体
0, //x坐标修正值。 默认在中间,偏移量相对于中间偏移
0, //y坐标修正值。 默认在中间,偏移量相对于中间偏移
0.8f//透明度:alpha 必须是范围 [0.0, 1.0] 之内(包含边界值)的一个浮点数字
);
//图片旋转
// 旋转180度
BufferedImage image = ImgUtil.rotate(ImageIO.read(FileUtil.file("e:/pic/366466.jpg")), 180);
ImgUtil.write(image, FileUtil.file("e:/pic/result.png"));
五、总结
Hutool是一个功能强大且易用的Java工具库,它通过提供丰富的功能和简化常见任务的方法,使得Java开发变得更加高效和便捷。无论是字符串处理、日期时间操作、加密解密还是文件操作和网络通信,Hutool都提供了简单而强大的工具,是Java开发者的全能工具库。