功能强大的java工具库Hutool

Hutool是一个小而全的Java工具类库,它通过静态方法封装,降低了相关API的学习成本,提高了工作效率,使Java拥有函数式语言般的优雅。以下是关于Hutool的详细介绍:

一、基本信息

  • 名称:Hutool
  • 寓意:Hu(谐音"糊涂") + tool,寓意追求"万事都作糊涂观,无所谓失,无所谓得"的境界。
  • 开发者:由国内开发者林智能(looly)开发并维护。
  • 版本:截至当前时间(2024年08月08日),最新版本可能有所更新,但可参考的版本如v5.8.29等。

二、功能特点

  1. 简洁易用:提供简单而一致的API,使开发者能够快速上手并提高开发效率。
  2. 功能丰富:涵盖了Java开发底层代码中的方方面面,包括但不限于文件、流、加密解密、转码、正则、线程、XML等,并组成各种Util工具类。
  3. 高性能:在实现上注重性能优化,采用高效的算法和数据结构,处理大规模数据和高并发场景表现出色。
  4. 可靠稳定:经过广泛测试和实际应用验证,具有良好的稳定性和可靠性。

三、核心模块

  1. 日期时间操作:提供方便的日期时间操作方法,支持日期格式化、解析、计算、比较等。
  2. 加密解密:支持常见的加密解密算法,如MD5、SHA1、AES、DES等,通过简单的API调用实现数据的加密和解密。
  3. 文件操作:提供文件读写、复制、移动、删除等操作的方法,方便开发者进行文件管理和处理。
  4. 网络通信:封装了HTTP客户端和服务端的操作方法,支持HTTP请求发送和接收,简化了网络通信的实现。
  5. 类型转换:提供了一整套的类型转换解决方案,并通过ConverterRegistry工厂类自定义转换。
  6. 字符串处理:提供丰富的字符串处理方法,如判断字符串是否为空、截取、拼接、格式化等。

四、使用示例

在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开发者的全能工具库。

相关推荐
Scott9999HH3 小时前
【IIoT流量实战】蒸汽管道阀门全关却仍有流量?用 Python 实现涡街信号 FFT 频谱分析与温压全补偿积算网关,深度拆解靠谱的涡街流量计厂家硬核技术标准
开发语言·python
腻害兔3 小时前
【若依项目-产品经理视角】深度拆解 RuoYi-Vue-Pro 商城模块:从商品管理到交易引擎,50 张表撑起一整套电商系统
java·大数据·vue.js·产品经理·ai编程
码智社4 小时前
AES加密原理详解及Java实现加解密实战
java·开发语言
AI云海4 小时前
python 列表、元组、集合和字典
开发语言·python
萧瑟余晖5 小时前
JDK 26 新特性详解
java·开发语言
马优晨5 小时前
Freemarker 完整讲解(后端 Java 模板引擎)
java·开发语言·freemarker·freemarker 完整讲解·freemarker模板引擎
人邮异步社区7 小时前
怎么把C语言学到精通?
c语言·开发语言
心平气和量大福大8 小时前
C#-WPF-控件-TextBox 数据绑定
开发语言·c#·wpf
ttwuai8 小时前
Cursor 生成 CRUD 后,Go 后台接口别只测 200:JWT、RBAC 和 tenant_id 怎么验
开发语言·后端·golang
维天说8 小时前
CLI-Switch 2026年3月版历史设计:Hook、TTY 隔离与 JSON 状态
java·服务器·json