顺带说说 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; 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、压缩工具
在 Java 中,对文件、文件夹打包压缩是一件很繁琐的事情,Hutool 封装的 ZipUtil 针对 java.util.zip 包做了优化,可以使用一个方法搞定压缩和解压,并且自动处理文件和目录的问题,不再需要用户判断,大大简化的压缩解压的复杂度。
ZipUtil.zip("hutool", "hutool.zip");
File unzip = ZipUtil.unzip("hutool.zip", "hutoolzip");
08、身份证工具
Hutool 封装的 IdcardUtil 可以用来对身份证进行验证,支持大陆 15 位、18 位身份证,港澳台 10 位身份证。
String ID_18 = "321083197812162119";
String ID_15 = "150102880730303";
boolean valid = IdcardUtil.isValidCard(ID_18);
boolean valid15 = IdcardUtil.isValidCard(ID_15);
09、扩展 HashMap
Java 中的 HashMap 是强类型的,而 Hutool 封装的 Dict 对键的类型要求没那么严格。
Dict dict = Dict.create() .set("age", 18) .set("name", "沉默王二") .set("birthday", DateTime.now()); int age = dict.getInt("age"); String name = dict.getStr("name");
10、控制台打印
本地编码的过程中,经常需要使用 System.out 打印结果,但是往往一些复杂的对象不支持直接打印,比如说数组,需要调用 Arrays.toString。Hutool 封装的 Console 类借鉴了 JavaScript 中的 console.log(),使得打印变成了一个非常便捷的方式。
public class ConsoleDemo { public static void main(String[] args) { // 打印字符串 Console.log("沉默王二,一枚有趣的程序员"); // 打印字符串模板 Console.log("洛阳是{}朝古都",13); int [] ints = {1,2,3,4}; // 打印数组 Console.log(ints); } }
11、字段验证器
做 Web 开发的时候,后端通常需要对表单提交过来的数据进行验证。Hutool 封装的 Validator 可以进行很多有效的条件验证:
是不是邮箱
是不是 IP V4、V6
是不是电话号码
等等
Validator.isEmail("沉默王二");
Validator.isMobile("itwanger.com");