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

相关推荐
励志成为嵌入式工程师32 分钟前
c语言简单编程练习9
c语言·开发语言·算法·vim
捕鲸叉1 小时前
创建线程时传递参数给线程
开发语言·c++·算法
A charmer1 小时前
【C++】vector 类深度解析:探索动态数组的奥秘
开发语言·c++·算法
Peter_chq1 小时前
【操作系统】基于环形队列的生产消费模型
linux·c语言·开发语言·c++·后端
Yaml42 小时前
Spring Boot 与 Vue 共筑二手书籍交易卓越平台
java·spring boot·后端·mysql·spring·vue·二手书籍
小小小妮子~2 小时前
Spring Boot详解:从入门到精通
java·spring boot·后端
hong1616882 小时前
Spring Boot中实现多数据源连接和切换的方案
java·spring boot·后端
aloha_7892 小时前
从零记录搭建一个干净的mybatis环境
java·笔记·spring·spring cloud·maven·mybatis·springboot
记录成长java3 小时前
ServletContext,Cookie,HttpSession的使用
java·开发语言·servlet
前端青山3 小时前
Node.js-增强 API 安全性和性能优化
开发语言·前端·javascript·性能优化·前端框架·node.js