星座和属相:
// 射手座String zodiac = DateUtil.getZodiac(Month.DECEMBER.getValue(), 10);
// 蛇
String chineseZodiac = DateUtil.getChineseZodiac(1989);
04、IO 流相关
IO 操作包括读和写,应用的场景主要包括网络操作和文件操作,原生的 Java 类库区分字符流和字节流,字节流 InputStream 和 OutputStream 就有很多很多种,使用起来让人头皮发麻。
Hutool 封装了流操作工具类 IoUtil、文件读写操作工具类 FileUtil、文件类型判断工具类 FileTypeUtil 等等。
BufferedInputStream in = FileUtil.getInputStream("hutool/origin.txt");BufferedOutputStream out = FileUtil.getOutputStream("hutool/to.txt");
long copySize = IoUtil.copy(in, out, IoUtil.DEFAULT_BUFFER_SIZE);
在 IO 操作中,文件的操作相对来说是比较复杂的,但使用频率也很高,几乎所有的项目中都躺着一个叫 FileUtil 或者 FileUtils 的工具类。Hutool 的 FileUtil 类包含以下几类操作:
文件操作:包括文件目录的新建、删除、复制、移动、改名等
文件判断:判断文件或目录是否非空,是否为目录,是否为文件等等
绝对路径:针对 ClassPath 中的文件转换为绝对路径文件
文件名:主文件名,扩展名的获取
读操作:包括 getReader、readXXX 操作
写操作:包括 getWriter、writeXXX 操作
顺带说说 classpath。
在实际编码当中,我们通常需要从某些文件里面读取一些数据,比如配置文件、文本文件、图片等等,那这些文件通常放在什么位置呢?
放在项目结构图中的 resources 目录下,当项目编译后,会出现在 classes 目录下。对应磁盘上的目录如下图所示:
当我们要读取文件的时候,我是不建议使用绝对路径的,因为操作系统不一样的话,文件的路径标识符也是不一样的。最好使用相对路径。
假设在 src/resources 下放了一个文件 origin.txt,文件的路径参数如下所示:
FileUtil.getInputStream("origin.txt")假设文件放在 src/resources/hutool 目录下,则路径参数改为:
FileUtil.getInputStream("hutool/origin.txt")05、字符串工具
Hutool 封装的字符串工具类 StrUtil 和 Apache Commons Lang 包中的 StringUtils 类似,作者认为优势在于 Str 比 String 短,尽管我不觉得。不过,我倒是挺喜欢其中的一个方法的:
String template = "{},一枚沉默但有趣的程序员,喜欢他的文章的话,请微信搜索{}";String str = StrUtil.format(template, "沉默王二", "沉默王二");
// 沉默王二,一枚沉默但有趣的程序员,喜欢他的文章的话,请微信搜索沉默王二
06、反射工具
反射机制可以让 Java 变得更加灵活,因此在某些情况下,反射可以做到事半功倍的效果。Hutool 封装的反射工具 ReflectUtil 包括:
获取构造方法
获取字段
获取字段值
获取方法
执行方法(对象方法和静态方法)
package com.itwanger.hutool.reflect;import cn.hutool.core.util.ReflectUtil;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
/**
* @author 微信搜「沉默王二」,回复关键字 PDF
*/
public class ReflectDemo {
private int id;
public ReflectDemo() {
System.out.println("构造方法");
}
public void print() {
System.out.println("我是沉默王二");
}
public static void main(String[] args) throws IllegalAccessException {
// 构建对象
ReflectDemo reflectDemo = ReflectUtil.newInstance(ReflectDemo.class);
// 获取构造方法
Constructor[] constructors = ReflectUtil.getConstructors(ReflectDemo.class);
for (Constructor constructor : constructors) {
System.out.println(constructor.getName());
}
// 获取字段
Field field = ReflectUtil.getField(ReflectDemo.class, "id");
field.setInt(reflectDemo, 10);
// 获取字段值
System.out.println(ReflectUtil.getFieldValue(reflectDemo, field));
// 获取所有方法
Method[] methods = ReflectUtil.getMethods(ReflectDemo.class);
for (Method m : methods) {
System.out.println(m.getName());
}
// 获取指定方法
Method method = ReflectUtil.getMethod(ReflectDemo.class, "print");
System.out.println(method.getName());
// 执行方法
ReflectUtil.invoke(reflectDemo, "print");
}
}
07、压缩工具