12、双向查找 Map
Guava 中提供了一种特殊的 Map 结构,叫做 BiMap,实现了一种双向查找的功能,可以根据 key 查找 value,也可以根据 value 查找 key,Hutool 也提供这种 Map 结构。
BiMap<String, String> biMap = new BiMap<>(new HashMap<>()); biMap.put("wanger", "沉默王二"); biMap.put("wangsan", "沉默王三"); // get value by key biMap.get("wanger"); biMap.get("wangsan"); // get key by value biMap.getKey("沉默王二"); biMap.getKey("沉默王三");
1
在实际的开发工作中,其实我更倾向于使用 Guava 的 BiMap,而不是 Hutool 的。这里提一下,主要是我发现了 Hutool 在线文档上的一处错误,提了个 issue(从中可以看出我一颗一丝不苟的心和一双清澈明亮的大眼睛啊)。
ImgUtil.scale( FileUtil.file("hutool/wangsan.jpg"), FileUtil.file("hutool/wangsan_small.jpg"), 0.5f ); 裁剪图片: ImgUtil.cut( FileUtil.file("hutool/wangsan.jpg"), FileUtil.file("hutool/wangsan_cut.jpg"), new Rectangle(200, 200, 100, 100) );
13、图片工具
Hutool 封装的 ImgUtil 可以对图片进行缩放、裁剪、转为黑白、加水印等操作。
缩放图片:
ImgUtil.scale( FileUtil.file("hutool/wangsan.jpg"), FileUtil.file("hutool/wangsan_small.jpg"), 0.5f );
添加水印:
ImgUtil.pressText(// FileUtil.file("hutool/wangsan.jpg"), FileUtil.file("hutool/wangsan_logo.jpg"), "沉默王二", Color.WHITE, new Font("黑体", Font.BOLD, 100), 0, 0, 0.8f );
趁机让大家欣赏一下二哥帅气的真容。
14、配置文件
众所周知,Java 中广泛应用的配置文件 Properties 存在一个特别大的诟病:不支持中文。每次使用时,如果想存放中文字符,就必须借助 IDE 相关插件才能转为 Unicode 符号,而这种反人类的符号在命令行下根本没法看。
于是,Hutool 的 Setting 运用而生。Setting 除了兼容 Properties 文件格式外,还提供了一些特有功能,这些功能包括:
各种编码方式支持
变量支持
分组支持
先整个配置文件 example.setting,内容如下:
name=沉默王二
age=18
再来读取和更新配置文件:
public class SettingDemo { private final static String SETTING = "hutool/example.setting"; public static void main(String[] args) { // 初始化 Setting Setting setting = new Setting(SETTING); // 读取 setting.getStr("name", "沉默王二"); // 在配置文件变更时自动加载 setting.autoLoad(true); // 通过代码方式增加键值对 setting.set("birthday", "2020年09月29日"); setting.store(SETTING); } }
15、日志工厂
Hutool 封装的日志工厂 LogFactory 兼容了各大日志框架,使用起来也非常简便。
public class LogDemo { private static final Log log = LogFactory.get(); public static void main(String[] args) { log.debug("难得糊涂"); } }
先通过 LogFactory.get() 自动识别引入的日志框架,从而创建对应日志框架的门面 Log 对象,然后调用 debug()、info() 等方法输出日志。
如果不想创建 Log 对象的话,可以使用 StaticLog,顾名思义,一个提供了静态方法的日志类。
StaticLog.info("爽啊 {}.", "沉默王二的文章");
16、缓存工具
CacheUtil 是 Hutool 封装的创建缓存的快捷工具类,可以创建不同的缓存对象:
FIFOCache:先入先出,元素不停的加入缓存直到缓存满为止,当缓存满时,清理过期缓存对象,清理后依旧满则删除先入的缓存。
Cache<String, String> fifoCache = CacheUtil.newFIFOCache(3);
fifoCache.put("key1", "沉默王一");
fifoCache.put("key2", "沉默王二");
fifoCache.put("key3", "沉默王三");
fifoCache.put("key4", "沉默王四");
// 大小为 3,所以 key3 放入后 key1 被清除
String value1 = fifoCache.get("key1");
LFUCache,最少使用,根据使用次数来判定对象是否被持续缓存,当缓存满时清理过期对象,清理后依旧满的情况下清除最少访问的对象并将其他对象的访问数减去这个最少访问数,以便新对象进入后可以公平计数。
Cache<String, String> lfuCache = CacheUtil.newLFUCache(3);
lfuCache.put("key1", "沉默王一");
// 使用次数+1
lfuCache.get("key1");
lfuCache.put("key2", "沉默王二");
lfuCache.put("key3", "沉默王三");
lfuCache.put("key4", "沉默王四");
// 由于缓存容量只有 3,当加入第 4 个元素的时候,最少使用的将被移除(2,3被移除)
String value2 = lfuCache.get("key2");
String value3 = lfuCache.get("key3");
LRUCache,最近最久未使用,根据使用时间来判定对象是否被持续缓存,当对象被访问时放入缓存,当缓存满了,最久未被使用的对象将被移除。
Cache<String, String> lruCache = CacheUtil.newLRUCache(3);
lruCache.put("key1", "沉默王一");
lruCache.put("key2", "沉默王二");
lruCache.put("key3", "沉默王三");
// 使用时间近了
lruCache.get("key1");
lruCache.put("key4", "沉默王四");
// 由于缓存容量只有 3,当加入第 4 个元素的时候,最久使用的将被移除(2)
String value2 = lruCache.get("key2");
System.out.println(value2);
17、加密解密
加密分为三种:
对称加密(symmetric),例如:AES、DES 等
非对称加密(asymmetric),例如:RSA、DSA 等
摘要加密(digest),例如:MD5、SHA-1、SHA-256、HMAC 等
Hutool 针对这三种情况都做了封装:
对称加密 SymmetricCrypto
非对称加密 AsymmetricCrypto
摘要加密 Digester
快速加密工具类 SecureUtil 有以下这些方法:
1)对称加密
SecureUtil.aes
SecureUtil.des
2)非对称加密
SecureUtil.rsa
SecureUtil.dsa
3)摘要加密
SecureUtil.md5
SecureUtil.sha1
SecureUtil.hmac
SecureUtil.hmacMd5
SecureUtil.hmacSha1
只写一个简单的例子作为参考:
public class SecureUtilDemo {
static AES aes = SecureUtil.aes();
public static void main(String[] args) {
String encry = aes.encryptHex("沉默王二");
System.out.println(encry);
String oo = aes.decryptStr(encry);
System.out.println(oo);
}
}
18、其他类库
Hutool 中的类库还有很多,尤其是一些对第三方类库的进一步封装,比如邮件工具 MailUtil,二维码工具 QrCodeUtil,Emoji 工具 EmojiUtil,小伙伴们可以参考 Hutool 的官方文档:https://www.hutool.cn/
项目源码地址:https://github.com/looly/hutool