文档:https://github.com/springside/springside4/wiki/SpringSide-Utils-Overview
工具库对开发效率和代码质量的意义其实相当大。
推荐一个我的偶像「江南白衣」开源的工具库 SpringSide Utils,它是对市面上最好的工具库(如Commons Lang,Guava)的选型和封装,让我们只面对这统一的「门面」即可。
江南白衣(主导)出品的最新工具库是 唯品会Java开发基础类库 ,它与SpringSide Utils 一脉相承,但目前我的项目中用的还是SpringSide Utils,唯品会这个库等我回头再学习下。
SpringSide Utils 这个类库有一个缺点:工具类中的工具方法的「方法签名」持续在修改,但版本号一直是5.0.0。这导致了「用较早版本的库进行了开发,但当代码拿到新的环境下去编译,去Maven中央库取得5.0.0的Jar,却出现了『调用的方法出错』」的情况。
不过这只是微小的瑕疵。
下面是我整理的各个包和类的目录,用于方便知道「这个工具类库都有哪些功能啊」。
base包,基本工具系列:
https://github.com/springside/springside4/wiki/Base-Utils
布尔工具BooleanUtil
各种字符串转布尔值,布尔值取反
枚举工具集EnumUtil
枚举类型与long类型的互相转换
关于异常的工具类ExceptionUtil
1. 若干常用函数.
2. StackTrace性能优化相关,尽量使用静态异常避免异常生成时获取StackTrace,及打印StackTrace的消耗
补充一些缺少的参数校验方法的MoreValidate
参数校验统一使用Apache Common Lange Validate, 补充一些缺少的.
对象工具类ObjectUtil
hashCode和toString方法
关于系统设定,平台信息的变量Platforms
分隔符、Java目录、Java版本、操作系统版本
关于Properties的工具类PropertiesUtil
1. 统一读取Properties
2. 从文件或字符串装载Properties
关于系统Properties的工具类SystemPropertiesUtil
1. 统一的读取系统变量,其中Boolean.readBoolean的风格不统一,Double则不支持,都进行了扩展.
2. 简单的合并系统变量(-D),环境变量 和默认值,以系统变量优先,在未引入Commons Config时使用.
3. Properties 本质上是一个HashTable,每次读写都会加锁,所以不支持频繁的System.getProperty(name)来检查系统内容变化 因此扩展了一个ListenableProperties, 在其所关心的属性变化时进行通知.
collection包,容器工具系列:
数组工具类ArrayUtil
JDK Arrays的其他函数,如sort(), toString() 请直接调用
Common Lang ArrayUtils的其他函数,如subarray(),reverse(),indeOf(), 请直接调用
通用Collection的工具集CollectionUtil
判断是否为空/非空,获得第一个/最后一个元素,获得最大/最小的元素
使用扩展容器类型的工具类CommonCollections
联合多个Key来定位Value的HashMap.
创建性能与访问速度更优的微型Map
队列内元素唯一的List, 内部集成了一个HashSet来实现.
ArrayList 与 LinkedList的折衷版
关于List的工具集合ListUtil
1. 常用函数(如是否为空,sort/binarySearch/shuffle/reverse(via JDK Collection)
2. 各种构造函数(from guava and JDK Collection)
3. 各种扩展List类型的创建函数
5. 集合运算:交集,并集, 差集, 补集,from Commons Collection,但对其不合理的地方做了修正
关于Map的工具集合MapUtil
1. 常用函数(如是否为空)
2. 对于并发Map,增加putIfAbsent(返回最终值版), createIfAbsent这两个重要函数(from Common Lang)
3. 便捷的构造函数(via guava,Java Collections,并增加了用数组,List等方式初始化Map的函数)
4. 特殊的类型,包括WeakConcurrentHashMap, IntObjectHashMap, MapCounter, MultiKeyMap, RangeMap
Queue工具集QueueUtil
1.各种Queue,Dequeue的创建
2.特殊类型Queue:LIFO的Stack, LRU的Queue
关于Set的工具集合SetUtil
1. 各种Set的创建函数, 包括ConcurrentHashSet
2. 集合运算函数(交集,并集等,from guava)
线程安全的HashSet类ConcurrentHashSet
JDK并没有提供ConcurrenHashSet,考虑到JDK的HashSet也是基于HashMap实现的,因此ConcurrenHashSet也由ConcurrenHashMap完成。
用于装两个元素的类Pair
引入一个简简单单的Pair, 用于返回值返回两个元素.
自动排序的ArrayList类——SortedArrayList
从Jodd整体复制,部分指定了index的操作不支持,如 add(index, element)
Key为原子类型的集合类IntObjectHashMap
在数据结构上与HashMap不一样,空间占用与读写性能俱比原来更优.
Key为原子类型的集合类LongObjectHashMap
在数据结构上与HashMap不一样,空间占用与读写性能俱比原来更优.
concurrent包,并发工具系列
并发工具类ConcurrentTools
CountDownLatch、CyclicBarrier的工厂方法,及限流、采样工厂。
线程工具类ThreadUtil
不抛出异常的sleep方法,获得调用者/当前方法的类名、方法名。
ThreadLocal上下文ThreadLocalContext
提供简单的put/get方法用于简化ThreadLocal变量的存取
基本Future实现类BasicFuture
从Apache HttpClient 4.2 移植,一个Future实现类的基本框架.
程序触发的ThreadDump——ThreadDumpper
因为ThreadDump本身会造成JVM停顿,所以加上了开关和最少间隔时间的选项(默认不限制)
因为ThreadInfo的toString()最多只会打印8层的StackTrace,所以加上了最大打印层数的选项.(默认为8)
concurrent.jsr166e包(暂时看不懂,搁置)
concurrent.threadpool包,线程池工具类
有队列且线程数可变的线程池QueuableCachedThreadPool
通过控制TaskQueue,线程数,但线程数到达最大时会进入Queue中
线程池建造者类ThreadPoolBuilder
对比JDK Executors中的newFixedThreadPool(), newCachedThreadPool(),newScheduledThreadPool, 提供更多有用的配置项.
JDK Executors中的FixedPool的工作队列无限长,CachedPool的可能线程数无限多
这个建造者类可以为FixedPool设置队列长度,为CachedPool设置线程数。
线程池工具集ThreadPoolUtil
1. 优雅关闭线程池的方法(via guava)
2. 创建可自定义线程名的ThreadFactory(via guava)
3. 防止第三方Runnable未捕捉异常导致线程跑飞
io包,IO工具系列:
文件工具类FileUtil:
「文件读写」静态方法:
读文件到字节数组 / 字符串 / 字符串list
写 / 追加 内容到文件
获得文件的 输入 / 输出 流
「文件及目录操作」静态方法:
复制 / 移动 / 删除 文件(夹)
判断文件(夹)是否存在,获得文件扩展名
文件树遍历工具类FileTreeWalker:
列出指定目录下所有文件(包含或不包含文件夹),可以指定后缀名或通配符
文件路径工具类FilePathUtil:
将文件路径根据运行平台标准化成响应的路径字符串,整理路径,拼接路径名,获得上层目录的路径,获得参数clazz所在的Jar文件的绝对路径
流工具类IOUtil:
从流中读取字符串
向流中写入字符串
从输入流复制到输出流
针对classpath下资源文件的工具类ResourceUtil:
ResourceUtil.toString("application.properties")
兼容的工具集URLResourceUtil:
兼容url为无前缀,file://与classpath:// 三种情况
log包,日志工具
带限流功能的Logger——ThrottledSlf4jLogger
该logger在配置的时间间隔内只输出一条日志。
mapper包,Mapper系列(转换工具):
实体类A到实体类B的属性复制工具类BeanMapper:
映射单个实体 / 实体List / 实体数组
实体类和JSON字符串互相转化的工具类JsonMapper:
实体转JSON
JSON转实体
实体转JSONP
实体类和XML字符串互相转化的工具类XmlMapper:
实体转XML
XML转实体
misc包,ID生成工具:
封装各种生成唯一性ID算法的工具类IdGenerator
可以生成字符串,Long,byte[]
net包,网络工具系列:
IP工具类IPUtil
主要包含int, String/IPV4String, InetAdress/Inet4Address之间的互相转换
关于网络的工具类NetUtil
1. 获取Local Address
2. 查找空闲端口
number包,数字工具系列:
数学相关工具类MathUtil:
2的倍数的计算
其他函数如最大公约数, 乘方,开方,安全的取模,可控制取整方向的相除等。
数字工具类NumberUtil
1.原始类型数字与byte[]的双向转换(via Guava)
2.判断字符串是否数字, 是否16进制字符串(via Common Lang)
3.10机制/16进制字符串 与 原始类型数字/数字对象 的双向转换(参考Common Lang自写)
随机数工具类RandomUtil
1. 获取无锁的ThreadLocalRandom, 性能较佳的SecureRandom
2. 保证没有负数陷阱,也能更精确设定范围的nextInt/nextLong/nextDouble
3. 随机字符串
单位转换工具UnitConverter
将带单位的时间字符串转化为毫秒数.
reflect包,反射工具系列:
https://github.com/springside/springside4/wiki/Reflection
获取Class信息的工具类ClassUtil:
1. 取shortClassName 和 packageName
2. 获取全部父类,全部接口,以及全部Annotation
3. 获取标注了annotation的所有属性和方法
4. 获取方法与属性 (兼容了原始类型的参数, 并默认将方法与属性设为可访问)
5. 其他杂项
基于Cglib, 基于字节码生成的快速反射的工具类FastMethodInvoker
比如反射调用A类的“hello” 方法,cglib会直接生成一个调用a.hello()的FastMethod子类.
基于JDK的反射工具类MethodInvoker
不如上面的FastMethodInvoker快
反射工具类ReflectionUtil
1. 对于构造函数,直接使用本类即可
2. 对于方法调用,本类全部是一次性调用的简化方法,如果考虑性能,对反复调用的方法应使用 MethodInvoker 及 FastMethodInvoker.
3. 对于直接属性访问,恰当使用本类中的一次性调用,和基于预先获取的Field对象反复调用两种做法.
security包,安全工具:
安全工具类CryptoUtil
支持HMAC-SHA1消息签名 及 DES/AES对称加密的工具类.
摘要、签名、加密中,这个工具类提供签名和加密功能。摘要的功能由工具类HashUtil提供,见「文本工具」。
text包,文本工具:
https://github.com/springside/springside4/wiki/Text
编码常量类Charsets
提供Charsets.UTF_8 这样的常量
csv工具类CsvUtil
对象集合转csv,csv一行转字符数组
编码工具类EncodeUtil
Hex和Base64的编码解码,Base64的编码解码方法有URL安全的方法
转义工具类EscapeUtil
URL、XML、HTML的编码解码
Hash工具类HashUtil
1.SHA-1, 安全性较高, 返回byte[](可用Encodes进一步被编码为Hex, Base64)
MD5的安全性较低, 只在文件Checksum时支持.
crc32, murmur32这些不追求安全性, 性能较高, 返回int.
对StringUtils补充一些方法的MoreStringUtil
高性能的Split,单独replace first/last,判断字符串是否以字母开头 / 结尾,如果结尾字符为c, 去除掉该字符.,计算字符串被UTF8编码后的字节数
StringBuilder持有类StringBuilderHolder
通过StringBuilderHolder.getGlobal获得线程唯一的StringBuilder,能提升性能
文本校验工具TextValidator
通过正则表达判断是否正确的手机号,固定电话,身份证,邮箱等.
通配符匹配检验工具WildcardMatcher
验证给定字符串是否符合通配符表达式
time包,日期时间工具
缓存了的日期格式化工具类CachingDateFormatter
DateFormat.format()消耗较大,如果时间戳是递增的,而且同一单位内有多次format(),使用用本类减少重复调用.
日期提供者ClockUtil
使用它而不是直接取得系统时间, 方便测试,能获得系统当前时间、系统当前时间戳、操作系统启动到现在的纳秒数。
日期格式化工具DateFormatUtil
更好的Date的parse()与format(),及格式化时间间隔
日期工具类DateUtil
日期比较,日期往前往后滚动,直接设置时间字段,获取日期的位置(如是在一周的第几天),获得往前往后的时间(如当天第一秒),闰年及每月天数