一个我很喜欢的开源类库,可以帮你简化每一行代码,里面有各种工具。”老实说,我在日常工作中经常使用Hutool。它真的可以帮助我们简化每一行代码,让Java像函数式语言一样优雅,让Java语言变得“甜美”。Sweet”。不过,群里还有一些小伙伴说不知道这个开源库,也是第一次听说。所以决定写一篇文章普及一下。毕竟,好轮子值得推荐,Hutool的作者在官网上说,Hutool是Hu+tool的自造词(貌似不用说,大家也能猜到),“Hu”是用来向他致敬的“前身”公司,“tool”意为工具,谐音有趣,“糊涂”,寓意追求“万物皆糊涂,不失亦无得”(一个开源库已经上升到哲学的高度,作者太神奇了),看了下开发组成员的介绍,一个Java后端工具的作者,居然爱前端,爱数字,爱美女。嗯,是的,确实“很少见”confused”(手动狗头)。就连提交给这个开源库的PR(pullrequest)规范也很“恶心”(哈哈哈):this是废话,来吧,我们开始吧!01、引入HutoolMaven项目,只需要在pom.xml文件中添加如下依赖即可。cn.hutoolhutool-all5.4.3Hutool的设计思想是尽量减少重复定义和makeprojects里面的util包尽量少。一个好的轮子可以在很大程度上避免“复制粘贴”,从而节省我们开发人员在项目中封装公共类库和公共工具方法的时间。同时,一个成熟的开源库也能最大程度的避免封装不完善带来的bug。正如笔者在官网所说:以前我们打开搜索引擎->搜索“JavaMD5加密”->打开某博客->复制粘贴->改成更方便使用。Hutool之后,直接引入Hutool->SecureUtil.md5()Hutool不仅封装了JDK的底层文件、流、加解密、转码、正则化、线程、XML等,还提供了以下组件:非常多,很全面,鉴于此,我就只挑一些我喜欢的介绍一下(偷偷告诉你,我就是想偷懒)。02.类型转换类型转换在Java开发中很常见,尤其是从HttpRequest获取参数时,前端传递的是整数,而后端只能先获取字符串,然后调用parseXXX()方法进行转换。加上空判断也很麻烦。Hutool的Convert类可以简化这个操作,可以将任何可能的类型转换成指定的类型,第二个参数defaultValue可以用来在转换失败时返回一个默认值。Stringparam="10";intparamInt=Convert.toInt(param);intparamIntDefault=Convert.toInt(param,0);将字符串转换为日期:StringdateStr="2020-09-29";Datedate=Convert.toDate(dateStr);将字符串转换为Unicode:StringunicodeStr="沉默之王二";Stringunicode=Convert.strToUnicode(unicodeStr);舒服多了!获取当前日期:Datedate=DateUtil.date();DateUtil.date()实际返回的是DateTime,它继承了Date对象,重写了toString()方法,返回格式为yyyy-MM-ddHH:mm:ss字符串。有没有朋友想看我写这篇文章的时候,输出给大家看:System.out.println(date);//2020-09-2904:28:02Stringtodate:StringdateStr="2020-09-29";Datedate=DateUtil.parse(dateStr);DateUtil.parse()会自动识别一些常见的格式,例如:yyyy-MM-ddHH:mm:ssyyyy-MM-ddHH:mm:ssyyyy-MM-ddHH:mmyyyy-MM-ddHH:mm:ss.SSS也可以识别汉字:年月日时分秒格式时差:StringdateStr1="2020-09-2922:33:23";Datedate1=DateUtil.parse(dateStr1);StringdateStr2="2020-10-0123:34:27";Datedate2=DateUtil.parse(dateStr2);longbetweenDay=DateUtil.between(date1,date2,DateUnit.MS);//输出:2天1小时1分4秒StringformatBetween=DateUtil.formatBetween(betweenDay,BetweenFormater.Level.SECOND);星座与生肖://射手座Stringzodiac=DateUtil.getZodiac(Month.DECEMBER.getValue(),10);//SnakeStringchineseZodiac=DateUtil.getChineseZodiac(1989);04.IO流相关的IO操作包括读和写。应用场景主要包括网络操作和文件操作。本机Java类库区分字符流和字节流。字节流InputStream和OutputStream的种类很多,用起来真是头皮发麻。Hutool封装了流操作工具类IoUtil、文件读写操作工具类FileUtil、文件类型判断工具类FileTypeUtil等。BufferedInputStreamin=FileUtil.getInputStream("hutool/origin.txt");BufferedOutputStreamout=FileUtil.getOutputStream("hutool/to.txt");longcopySize=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,文件的path参数如下:FileUtil.getInputStream("origin.txt")假设文件放在src/resources/hutool目录下,path参数改为:FileUtil.getInputStream("hutool/origin.txt")05.字符串工具Hutool封装的字符串工具类StrUtil类似于ApacheCommonsLang包中的StringUtils。作者认为优点是Str比String短,虽然我不这么认为。不过我挺喜欢其中一个方法:Stringtemplate="{},一个沉默但有趣的程序员,如果喜欢他的文章,请微信搜索{}";Stringstr=StrUtil.format(template,"沉默王二","沉默汪二");//沉默汪二,沉默但有趣的程序员,如果喜欢他的文章,请微信搜索沉默汪二。06.反射工具反射机制可以让Java更加灵活,所以反射在某些情况下可以事半功倍。Hutool封装的反射工具ReflectUtil,包括:获取构造函数获取字段获取字段值获取方法执行方法(对象方法和静态方法)packagecom.itwanger.hutool.reflect;importcn.hutool.core.util.ReflectUtil;importjava.lang.reflect.构造函数;导入java。郎。反映。场地;导入java。.println("构造方法");}publicvoidprint(){System.out.println("我是沉默的二王");}publicstaticvoidmain(String[]args)throwsIllegalAccessException{//构建对象ReflectDemoreflectDemo=ReflectUtil。newInstance(ReflectDemo.class);//获取构造方法Constructor[]constructors=ReflectUtil.getConstructors(ReflectDemo.class);for(Constructorconstructor:constructors){System.out.println(constructor.getName());}//获取字段Fieldfield=ReflectUtil.getField(ReflectDemo.class,"id");field.setInt(reflectDemo,10);//获取字段值System.out.println(ReflectUtil.getFieldValue(reflectDemo,field));//获取所有方法Method[]methods=ReflectUtil.getMethods(ReflectDemo.class);for(Methodm:methods){System.out.println(m.getName());}//获取指定方法Methodmethod=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");Fileunzip=ZipUtil.unzip("hutool.zip","hutoolzip");08.身份证工具Hutool封装的IdcardUtil可用于验证身份证,支持大陆15位身份证,18位身份证,港澳台10位身份证。StringID_18="321083197812162119";StringID_15="150102880730303";booleanvalid=IdcardUtil.isValidCard(ID_18);booleanvalid15=IdcardUtil.isValidCard(ID_15);类型要求不那么严格。Dictdict=Dict.create().set("age",18).set("name","沉默之王二").set("生日",DateTime.now());intage=dict.getInt("年龄");Stringname=dict.getStr("姓名");10、在控制台打印本地编码的过程中,经常需要使用System.out来打印结果,但往往有些复杂的对象是不支持直接打印的,比如数组,需要调用Arrays.toString。Hutool封装的Console类借鉴了JavaScript中的console.log(),使得打印成为一种非常方便的方式。/***@作者微信搜索“沉默王二”,回复关键词PDF*/publicclassConsoleDemo{publicstaticvoidmain(String[]args){//PrintstringConsole.log("沉默王二,一个有趣的程序员");//printstringtemplateConsole.log("洛阳是{}王朝的古都",13);int[]ints={1,2,3,4};//打印数组Console.log(ints);}}11.FieldValidator做web开发时,后端通常需要对表单提交的数据进行校验。Hutool封装的Validator可以进行很多有效的条件验证:邮箱是否是IPV4、V6,是否是电话号码等。Validator.isEmail("沉默王二");Validator.isMobile("itwanger.com");122.双向搜索MapGuava提供了一个特殊的Map结构BiMap,它实现了双向搜索的功能。可以根据key找到value,也可以根据value找到key。Hutool也提供了这个Map结构。BiMapbiMap=newBiMap<>(newHashMap<>());biMap.put("wanger","沉默之王二");biMap.put("wangsan","沉默之王三");//getvaluebykeybiMap.get("wanger");biMap.get("wangsan");//getkeybyvaluebiMap.getKey("沉默王二");biMap.getKey("沉默王三");在实际的开发工作中,其实我更喜欢使用Guava的BiMap而不是Hutool的。在这里提一下,主要是我在Hutool的在线文档中发现了一个错误,提出了一个issue(从中可以看出我一丝不苟的心和一双清澈明亮的大眼睛)。13、Hutool封装的图片工具ImgUtil,可以对图片进行缩放、裁剪、转黑白、加水印等操作。缩放图像: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"),newRectangle(200,200,100,100));添加水印:ImgUtil.pressText(//FileUtil.file("hutool/wangsan.jpg"),FileUtil.file("hutool/wangsan_logo.jpg"),"沉默之王2",Color.WHITE,newFont("黑体",Font.BOLD,100),0,0,0.8f);14.配置文件众所周知,在Java中广泛使用的配置文件Properties有一个特别大的非议:不支持中文。每次使用的时候,如果要存储汉字,就必须使用IDE相关的插件将其转换成Unicode符号,而这种反人类的符号在命令行中是根本看不到的。于是,Hutool这个设置应用就诞生了。除了兼容Properties文件格式,Setting还提供了一些独特的功能,这些功能包括:各种编码方式,支持变量,支持分组,支持整个配置文件示例。并更新配置文件:/***@作者微信搜索“沉默之王II”,回复关键词PDF*/publicclassSettingDemo{privatefinalstaticStringSETTING="hutool/example.setting";publicstaticvoidmain(String[]args){//InitializeSettingSettingsetting=newSetting(SETTING);//读取setting.getStr("name","沉默之王二");//配置文件变化时自动加载setting.autoLoad(true);//通过代码添加键值对设置。set("birthday","September29,2020");setting.store(SETTING);}}15、Hutool封装的日志工厂LogFactory兼容各大日志框架,非常好用。/***@作者微信搜索“沉默之王二”,回复关键字PDF*/publicclassLogDemo{privatestaticfinalLoglog=LogFactory.get();publicstaticvoidmain(String[]args){log.debug("很少混淆");}},通过LogFactory.get()自动识别导入的日志框架,从而创建日志框架对应的门面Log对象,然后调用debug()、info()等方法输出日志。如果不想创建Log对象,可以使用StaticLog,顾名思义,一个提供静态方法的日志类。StaticLog.info("爽啊{}.","沉默王二的文章");16、缓存工具CacheUtil是Hutool封装的创建缓存的快捷工具类,可以创建不同的缓存对象:FIFOCache:先进先出,不断向缓存中添加元素,直到缓存满为止。当缓存满了,过期的缓存对象会被清除。如果清理后缓存还是满的,会删除之前的缓存。CachefifoCache=CacheUtil.newFIFOCache(3);fifoCache.put("key1","silentkingone");fifoCache.put("key2","silentkingtwo");fifoCache.put("key3","沉默王三");fifoCache.put("key4","沉默王四");//大小为3,所以key3放入后清空key1Stringvalue1=fifoCache.get("key1");LFUCache,最少使用,根据使用次数判断对象是否持续缓存。当缓存已满时,清除过期的对象。如果清理后还是满的,就把访问最少的对象清空,其他对象减去最少访问次数。这样新对象在进来时就可以被公平地计算出来。CachelfuCache=CacheUtil.newLFUCache(3);lfuCache.put("key1","寂静王一号");//使用次数+1lfuCache.get("key1");lfuCache.put("key2","沉默之王2");lfuCache.put("key3","沉默之王3");lfuCache.put("key4","沉默之王4");//自缓存capacity只有3,当添加第一个有4个元素时,最少使用的会被移除(2,3被移除)Stringvalue2=lfuCache.get("key2");Stringvalue3=lfuCache.get("key3");LRUCache,最长时间未被使用,根据使用时间判断对象是否被持续缓存。当对象被访问时,它被放置在缓存中。当缓存已满时,最长时间未使用的对象将被移除。CachelruCache=CacheUtil.newLRUCache(3);lruCache.put("key1","沉默之王1");lruCache.put("key2","沉默之王2");lruCache.put("key3","沉默王三");//使用时间接近lruCache.get("key1");lruCache.put("key4","沉默王四");//因为缓存容量只有3,当添加到第四个元素时,使用时间最长的将被移除(2)Stringvalue2=lruCache.get("key2");System.out.println(value2);17、加密和解密分为三种:对称加密(symmetric),如:AES、DES等非对称加密(asymmetric),如:RSA、DSA等摘要式加密(digest),如:MD5、SHA-1、SHA-256、HMAC等针对这三种情况的Hutool封装:对称加密SymmetricCrypto非对称加密AsymmetricCryptoDigest加密Digester快速加密工具类SecureUtil有如下方法:1)对称加密SecureUtil.aesSecureUtil.des2)非对称加密SecureUtil.rsaSecureUtil.dsa3)摘要加密SecureUtil.md5SecureUtil.sha1SecureUtil.hmacSecureUtil.hmacMd5SecureUtil.hmacSha1写个简单的例子参考一下:/***@author微信搜索“沉默之王二”,回复关键字PDF*/publicclassSecureUtilDemo{staticAESaes=SecureUtil.aes();publicstaticvoidmain(String[]args){Stringencry=aes.encryptHex("沉默王二");System.out.println(encry);Stringoo=aes.decryptStr(encry);System.out.println(oo);}}18、其他类库Hutool中有很多类库,特别是一些对第三方类库的进一步封装,比如邮件工具MailUtil、二维码工具QrCodeUtil、Emoji工具EmojiUtil。小伙伴们可以参考Hutool的官方文档:https://www.hutool.cn/项目源码地址:https://github.com/looly/hutoolPS:如果需要Java书单,我发现了一个宝藏项目在GitHub上。需要自己去取,地址如下:https://github.com/itwanger/JavaBooks