IO

一. org.apache.commons.io.IOUtils
closeQuietly:关闭一个IO流、socket、或者selector且不抛出异常,通常放在finally块

toString:转换IO流、 Uri、 byte[]为String

copy:IO流数据复制,从输入流写到输出流中,最大支持2GB

toByteArray:从输入流、URI获取byte[]

write:把字节. 字符等写入输出流

toInputStream:把字符转换为输入流

readLines:从输入流中读取多行数据,返回List

copyLarge:同copy,支持2GB以上数据的复制

lineIterator:从输入流返回一个迭代器,根据参数要求读取的数据量,全部读取,如果数据不够,则失败


(一)Google Guava IO 操作


https://blog.csdn.net/wuyuxing24/article/details/95891648


 文件


commons-io
commons-io
2.6


二. org.apache.commons.io.FileUtils
deleteDirectory:删除文件夹

readFileToString:以字符形式读取文件内容

deleteQueitly:删除文件或文件夹且不会抛出异常

copyFile:复制文件

writeStringToFile:把字符写到目标文件,如果文件不存在,则创建

forceMkdir:强制创建文件夹,如果该文件夹父级目录不存在,则创建父级

write:把字符写到指定文件中

listFiles:列举某个目录下的文件(根据过滤器)

copyDirectory:复制文件夹

forceDelete:强制删除文件



六. org.apache.commons.io.FilenameUtils

getExtension:返回文件后缀名

getBaseName:返回文件名,不包含后缀名

getName:返回文件全名

concat:按命令行风格组合文件路径(详见方法注释)

removeExtension:删除后缀名

normalize:使路径正常化

wildcardMatch:匹配通配符

seperatorToUnix:路径分隔符改成unix系统格式的,即/

getFullPath:获取文件路径,不包括文件名

isExtension:检查文件后缀名是不是传入参数(List)中的一个



 数字

(一)NumberUtils


字符串转int long float double byte short 这些类型数据

toInt
toLong 等等 to开头的方法, 也可以设置如果转换失败就返回默认的值


判断字符串是否可以转成数组类型的
isParsable

说明:检验提供的字符串是否可以转换为number,
可解析的number包括下面的方法
Integer.parseInt(String)
Long.parseLong(String)
Float.parseFloat(String)
Double.parseDouble(String)
这个方法可以替代ParseException异常当调用上面的方法时;
十六进制和科学符号被认为是不可解析的;
null和空字符串返回false;
参数:str-检验的字符串;
返回数据:true-如果参数是可转换的字符串;

根据字符串各种创建方法

详细的东西在使用的时候就去看源码

createNumber
createBigInteger
createBigDecimal
createFloat
createNumber
createInteger

判断数组或者一堆值里面是否有最大最小
可以判断 int long double short byte float

max 判断最大
min 判断最小



判断字符串是否有是数字(包含也不行)

说明:检查字符串是否是只包含数字字符,Null和空将会返回false;
boolean a = NumberUtils.isDigits(“asd”); /false/

boolean b = NumberUtils.isDigits(“1”);/true/
boolean c = NumberUtils.isDigits(“asdas111dasda”);/false 字符串包含数字也不行/



比较两个int数值相等大小
int a = NumberUtils.compare(1, 1); /如果相等返回 0 /

int b = NumberUtils.compare(1, 2); /第一个参数比第二个大就返回-1 /

int c = NumberUtils.compare(2, 1); /第二个参数比第一个大就返回1 /



判断字符串是否是有效的数字

isCreatable

检查给定的String是否为可解析数字


isParsable //执行Integer.parseInt(Str)不报错的字符串,用这个方法检查就是true, 如果Integer.parseInt(Str)报错的字符串,执行这个方法检查就是返回false, 我是这么理解的,有时间测试一下




 数组


lang3是Apache Commons 团队发布的工具包,要求jdk版本在1.5以上,相对于lang来说完全支持java5的特性,废除了一些旧的API。该版本无法兼容旧有版本,于是为了避免冲突改名为lang3

八. org.apache.commons.lang3.ArrayUtils
contains:是否包含某字符串

addAll:添加整个数组

clone:克隆一个数组

isEmpty:是否空数组

add:向数组添加元素

subarray:截取数组

indexOf:查找某个元素的下标

isEquals:比较数组是否相等

toObject:基础类型数据数组转换为对应的Object数组



 字符串操作


三. org.apache.commons.lang.StringUtils
isBlank:字符串是否为空 (trim后判断)

isEmpty:字符串是否为空 (不trim并判断)

equals:字符串是否相等

join:合并数组为单一字符串,可传分隔符

split:分割字符串

EMPTY:返回空字符串

trimToNull:trim后为空字符串则转换为null

replace:替换字符串


五. org.apache.commons.lang3.StringUtils
isBlank:字符串是否为空 (trim后判断)

isEmpty:字符串是否为空 (不trim并判断)

equals:字符串是否相等

join:合并数组为单一字符串,可传分隔符

split:分割字符串

EMPTY:返回空字符串

replace:替换字符串

capitalize:首字符大写

七. org.springframework.util.StringUtils
hasText:检查字符串中是否包含文本

hasLength:检测字符串是否长度大于0

isEmpty:检测字符串是否为空(若传入为对象,则判断对象是否为null)

commaDelimitedStringToArray:逗号分隔的String转换为数组

collectionToDelimitedString:把集合转为CSV格式字符串

replace 替换字符串

delimitedListToStringArray:相当于split

uncapitalize:首字母小写

collectionToDelimitedCommaString:把集合转为CSV格式字符串

tokenizeToStringArray:和split基本一样,但能自动去掉空白的单词

 拷贝

CGLIB的下面的:
· BeanCopier:用于两个bean之间,同名属性间的拷贝。
· BulkBean:用于两个bean之间,自定义get&set方法间的拷贝。
· BeanMap:针对POJO Bean与Map对象间的拷贝。
· BeanGenerator:根据Mapproperties的属性定义,动态生成POJO Bean类。
· ImmutableBean:同样用于两个bean间的属性拷贝,但生成的bean不允许调用set方法,也就是说,生成的对象是不可变的。




 实体类


四. org.apache.http.util.EntityUtils
toString:把Entity转换为字符串

consume:确保Entity中的内容全部被消费。可以看到源码里又一次消费了Entity的内容,假如用户没有消费,那调用Entity时候将会把它消费掉

toByteArray:把Entity转换为字节流

consumeQuietly:和consume一样,但不抛异常

getContentCharset:获取内容的编码


十六. org.apache.commons.beanutils.BeanUtils
copyPeoperties:复制属性值,从一个对象到另一个对象

getProperty:获取对象属性值

setProperty:设置对象属性值

populate:根据Map给属性复制

copyPeoperty:复制单个值,从一个对象到另一个对象

cloneBean:克隆bean实例


十四. org.apache.commons.beanutils.PropertyUtils
getProperty:获取对象属性值

setProperty:设置对象属性值

getPropertyDiscriptor:获取属性描述器

isReadable:检查属性是否可访问

copyProperties:复制属性值,从一个对象到另一个对象

getPropertyDiscriptors:获取所有属性描述器

isWriteable:检查属性是否可写

getPropertyType:获取对象属性类型



 集合

十二. org.apache.commons.collections.CollectionUtils
isEmpty:是否为空

select:根据条件筛选集合元素

transform:根据指定方法处理集合元素,类似List的map()

filter:过滤元素,雷瑟List的filter()

find:基本和select一样

collect:和transform 差不多一样,但是返回新数组

forAllDo:调用每个元素的指定方法

isEqualCollection:判断两个集合是否一致


 加密解密



十一. org.apache.commons.codec.digest.DigestUtils
md5Hex:MD5加密,返回32位字符串

sha1Hex:SHA-1加密

sha256Hex:SHA-256加密

sha512Hex:SHA-512加密

md5:MD5加密,返回16位字符串


hutool-crypto 加密解密模块

 转义和反转义


org.apache.commons.text.StringEscapeUtils
这个类还可以进行sql防止注入转换, 和xml html 转义

unescapeJava: Unicode转汉字 ,也可以json去斜杠转义
escapeJava: 汉字转Unicode

| String str = “{\\\“name\\\“:\\\“spy\\\“,\\\“id\\\“ :\\\“123456\\\“}”;
System.out.println(“原始 str = “ + str); // 原始 str = {\“name\“:\“spy\“,\“id\“ :\“123456\“}
String str1 = StringEscapeUtils.unescapeJava(str);
System.out.println(“目标 str1 = “ + str1); // 目标 str1 = {“name”:”spy”,”id” :”123456”} | | —- |




全是静态,直接用类调用即可

https://blog.csdn.net/x6582026/article/details/53463354

 反射

Apache-commons-MethodUtils
Apache-commons-ConstructorUtils
Apache-commons-PropertyUtils
Apache-commons-BeanUtils
Apache-commons-ConvertUtils


参考:
https://blog.csdn.net/wuyuxing24/article/details/102787758

 属性文件(配置文件)


commons-configuration

Apache Common-Configuration 工具可以从Properties文件,XML文件,JNDI,JDBC数据源,System Properties,Applet parameters,Servlet Parameters等读取相应信息。


有几个实现类

ProvidedURLLocationStrategy,
FileSystemLocationStrategy,
AbsoluteNameLocationStrategy,
BasePathLocationStrategy,
HomeDirectoryLocationStrategy,
ClasspathLocationStrategy,
CombinedLocationStrategy。

同时, 这些实现类可以构成一个扫描链来进行按照其顺序进行组合扫描。假设我们期望按照如下的顺序进行扫描我们的配置文件:

by their URL
by the file system (which will evaluate base path and file name)
on the classpath

代码实现如下:
List subs = Arrays.asList(
new ProvidedURLLocationStrategy(),
new FileSystemLocationStrategy(),
new ClasspathLocationStrategy());
FileLocationStrategy strategy = new CombinedLocationStrategy(subs);


自动重载配置文件

我们都希望我们的系统是高可用的,在我们修改配置文件的以后,不期望去重新启动服务,而希望其能够自动的重新加载。Commons-Configuration提供了一些组件来实现这一功能。
组件一:ReloadingDetector Interface
组件二:ReloadingController Class , ReloadingListener Interface
因为Commons-Configuration无法得知每个用户的期望触发重新加载的机制,所以其设计一个基于Timer的方案,作为一个最灵活的方式,同时它有提供了一个自定义触发器( a custom component triggering)组件的方法来适配各种不同的重载需求。

//**


hutool-setting 功能更强大的Setting配置文件和Properties封装

 系统参数调用


hutool-system 系统参数调用封装(JVM信息等)

 关键字查找

hutool-dfa 基于DFA模型的多关键字查找

https://www.bookstack.cn/read/hutool/453b51ee888bfc31.md



 图片验证码



hutool-captcha 图片验证码实现


 commons-lang

组件 功能介绍
builder 包含了一组用于产生每个Java类中都常使用到的toString()、 hashCode()、equals()、compareTo()等等方法的构造器
enums 用于处理枚举
exception 用于处理Java标准API中的exception,为1.4之前版本提供Nested Exception功能
math 用于处理数学相关
mutable 用于包装易变值类型的变量
reflect 反射相关
text 提供处理文本的功能
time 提供处理日期和时间的功能


静态类
在org.apache.commons.lang包中提供了一些有用的包含static方法的Util类。除了6个Exception类和2个已经deprecated的数字类之外,commons.lang包共包含了17个实用的类。

类名 作用
ArrayUtils 用于对数组的操作,如添加、查找、删除、子数组、倒序、元素类型转换等
BitField 用于操作位元,提供了一些方便而安全的方法
BooleanUtils 用于操作和转换boolean或者Boolean及相应的数组
CharEncoding 包含了Java环境支持的字符编码,提供是否支持某种编码的判断
CharRange 用于设定字符范围并做相应检查
CharSet 用于设定一组字符作为范围并做相应检查
CharSetUtils 用于操作CharSet
CharUtils 用于操作char值和Character对象
ClassUtils 用于对Java类的操作,不使用反射
ObjectUtils 用于操作Java对象,提供null安全的访问和其他一些功能
RandomStringUtils 用于生成随机的字符串
SerializationUtils 用于处理对象序列化,提供比一般Java序列化更高级的处理能力
StringEscapeUtils 用于正确处理转义字符,产生正确的Java、JavaScript、HTML、XML和SQL代码
StringUtils 处理String的核心类,提供了相当多的功能
SystemUtils 在java.lang.System基础上提供更方便的访问,如用户路径、Java版本、时区、操作系统等判断
Validate 提供验证的操作,有点类似assert断言
WordUtils 用于处理单词大小写、换行等


 布隆过滤器

hutool-bloomFilter 布隆过滤,提供一些Hash算法的布隆过滤

 定时任务

hutool-cron 定时任务模块,提供类Crontab表达式的定时任务


 动态代理切面

hutool-aop JDK动态代理封装,提供非IOC下的切面支持



 JDBC



hutool-db JDBC封装后的数据操作,基于ActiveRecord思想

 模板引擎、邮件等



hutool-extra 扩展模块,对第三方封装(模板引擎、邮件等)

 Http



hutool-http 基于HttpUrlConnection的Http客户端封装

 日志



hutool-log 自动识别日志实现的日志门面

 脚本执行封装





hutool-script 脚本执行封装,例如Javascript


 //*

Apache-Commons大致组件说明[自己收集的不要删除]
官方API网站

http://commons.apache.org/proper/


Java工具类收集 - 图1

_一._beanUtils

提供了对于JavaBean进行各种操作, 比如对象,属性复制等等。


Commons BeanUtils一共包括如下5个包:

org.apache.commons.beanutils – 核心包,定义一组 Utils 类和需要用到的接口规范

org.apache.commons.beanutils.converters – 转换 String 到需要类型的类,实现 Converter 接口

org.apache.commons.beanutils.locale –beanutils 的 locale 敏感版本

org.apache.commons.beanutils.locale.converters– converters 的 locale 敏感版本

org.apache.commons.collections – beanutils 使用到的 Collection 类

其中需要我们特别关注的是这个org.apache.commons.beanutils包,其他包都是起辅助作用的。接下来我们就仔细看一看这个包都有些什么东东:

4个接口

1.Converter

该接口定义了如下方法:

1publicjava.lang.Object convert(java.lang.Class type, java.lang.Object value);

只要实现了这个Converter接口并注册到ConvertUtils类即可被我们的BeanUtils包所使用,它的主要目的是提供将给定的Object实例转换为目标类型的算法。我们可以在beanutils.converters包中找到相当多的已经实现的转换器。

2.DynaBean

该接口定义的是一个动态的JavaBean,它的属性类型、名称和值都是可以动态改变的。

3.DynaClass

该接口定义的是针对实现了DynaBean接口的类的java.lang.Class对象,提供如getName()、newInstance()等方法。

4.MutableDynaClass

该接口是对DynaClass的扩展,使得动态bean的属性可以动态增加或删除。

24个类

Java工具类收集 - 图2

Java工具类收集 - 图3

Java工具类收集 - 图4

只要把握好BeanUtils本身要完成的事,就不难理解这些类存在的道理。我们不妨把BeanUtils的基础应用分解成:访问JavaBean的属性、设定JavaBean的属性、以及创建和使用DynaBeans。

二.codec

commons-codec是Apache开源组织提供的用于摘要运算、编码的包。在该包中主要分为四类加密:BinaryEncoders、DigestEncoders、LanguageEncoders、NetworkEncoders。

为大家介绍一下如何用commons-codec包完成常见的编码、摘要运算。

base64

@Testpublic void testBase64(){ System.out.println(“==============Base64================”); byte[] data = “imooc”.getBytes(); Base64 base64 = new Base64(); String encode = base64.encodeAsString(data); System.out.println(encode); System.out.println(new String(base64.decode(encode)));}

运行结果:

==============Base64================amlhbmdndWppbg==imooc

MD5

@Testpublic void testMD5(){ System.out.println(“==============MD5================”); String result = DigestUtils.md5Hex(“imooc”); System.out.println(result);}

URLCode

@Testpublic void testURLCodec() throws Exception{ System.out.println(“==============URLCodec================”); URLCodec codec = new URLCodec(); String data = “imooc”; String encode = codec.encode(data, “UTF-8”); System.out.println(encode); System.out.println(codec.decode(encode, “UTF-8”));}

运行结果:

==============URLCodec================%E8%92%8B%E5%9B%BA%E9%87%91imooc

三.collections

对java.util的扩展封装,处理数据还是挺灵活的。
org.apache.commons.collections – Commons Collections自定义的一组公用的接口和工具类
org.apache.commons.collections.bag – 实现Bag接口的一组类
org.apache.commons.collections.bidimap – 实现BidiMap系列接口的一组类
org.apache.commons.collections.buffer – 实现Buffer接口的一组类
org.apache.commons.collections.collection – 实现java.util.Collection接口的一组类
org.apache.commons.collections.comparators – 实现java.util.Comparator接口的一组类
org.apache.commons.collections.functors – Commons Collections自定义的一组功能类
org.apache.commons.collections.iterators – 实现java.util.Iterator接口的一组类
org.apache.commons.collections.keyvalue – 实现集合和键/值映射相关的一组类
org.apache.commons.collections.list – 实现java.util.List接口的一组类
org.apache.commons.collections.map – 实现Map系列接口的一组类
org.apache.commons.collections.set – 实现Set系列接口的一组类


Commons Collections,又是一个重量级的东西,为Java标准的Collections API提供了相当好的补充。Collections当然有它存在的道理,能够把常用的数据结构归纳起来,以通用的方式去维护和访问,这应该说是一种进步,但是用起来似乎不够友好。这个时候我就会想,如果Java比现在做得更好用些,或者有一套第三方的API把我的这些需求抽象出来,实现了,该多好。Commons Collections就是这样一套API。

Java工具类收集 - 图5

1.容器类:如Collection、List、Map等,用于存放对象和进行简单操作的;

2.操作类:如Collections、Arrays等,用于对容器类的实例进行相对复杂操作如排序等;

3.辅助类:如Iterator、Comparator等,用于辅助操作类以及外部调用代码实现对容器类的操作,所谓辅助,概括而通俗的来讲,就是这些类提供一种算法,你给它一个对象或者一组对象,或者仅仅是按一定的规则调用它,它给你一个运算后的答案,帮助你正确处理容器对象。比如Iterator会告诉你容器中下一个对象有没有、是什么,而Comparator将对象大小/先后次序的算法逻辑独立出来。

list包中的方法Commons Collections在java.util.Map的基础上扩展了很多接口和类,比较有代表性的是BidiMap、MultiMap和LazyMap。跟Bag和Buffer类似,Commons Collections也提供了一个MapUtils。

所谓BidiMap,直译就是双向Map,可以通过key找到value,也可以通过value找到key,这在我们日常的代码-名称匹配的时候很方便:因为我们除了需要通过代码找到名称之外,往往也需要处理用户输入的名称,然后获取其代码。需要注意的是BidiMap当中不光key不能重复,value也不可以。

所谓MultiMap,就是说一个key不在是简单的指向一个对象,而是一组对象,add()和remove()的时候跟普通的Map无异,只是在get()时返回一个Collection,利用MultiMap,我们就可以很方便的往一个key上放数量不定的对象,也就实现了一对多。

所谓LazyMap,意思就是这个Map中的键/值对一开始并不存在,当被调用到时才创建,这样的解释初听上去是不是有点不可思议?这样的LazyMap有用吗?我们这样来理解:我们需要一个Map,但是由于创建成员的方法很“重”(比如数据库访问),或者我们只有在调用get()时才知道如何创建,或者Map中出现的可能性很多很多,我们无法在get()之前添加所有可能出现的键/值对,或者任何其它解释得通的原因,我们觉得没有必要去初始化一个Map而又希望它可以在必要时自动处理数据生成的话,LazyMap就变得很有用了。

Collection包下的方法中首先就是这个TypedCollection,它实际上的作用就是提供一个decorate方法,我们传进去一个Collection和需要的类型甄别信息java.lang.Class,它给我们创建一个全新的强类型的Collection。我们其实在bag、buffer、list、map、set这些子包中都可以找到分别对应Bag、Buffer、List、Map、Set接口的TypedXxxx版本。

Bag是在org.apache.commons.collections包中定义的接口,它extends java.util.Collection,而它的实现类都被放在下面的bag包中。之所以有这样一组类型,是因为我们有时候需要在Collection中存放多个相同对象的拷贝,并且需要很方便的取得该对象拷贝的个数。需要注意的一点是它虽然extends Collection,但是如果真把它完全当作java.util.Collection来用会遇到语义上的问题,详细信息参考Javadoc。

HashBag是Bag接口的一个标准实现。而BagUtils提供一组static的方法让调用者获取经过不同装饰后的Bag实例。

Buffer是定义在org.apache.commons.collections包下面的接口,用于表示按一定顺序除去成员对象的collection如队列等。具体的实现类在org.apache.commons.collections.buffer包下可以找到。

BufferUtils提供很多静态/工具方法装饰现有的Buffer实例,如将其装饰成BlockingBuffer、执行类型检查的TypedBuffer、或者不可改变的UnmodifiableBuffer等等。

最简单直接的Buffer实现类是UnboundedFifoBuffer,提供先进先出的大小可变的队列。而BoundedFifoBuffer则是对其大小进行了限制,是固定大小的先进先出队列。BlockingBuffer要在多线程的环境中才能体现出它的价值,尤其是当我们需要实现某种流水线时这个BlockingBuffer很有用:每个流水线上的组件从上游的BlockingBuffer获取数据,处理后放到下一个BlockingBuffer中依次传递。BlockingBuffer的核心特色通俗点说就是如果你向它要东西,而它暂时还没有的话,你可以一直等待直至拿到为止。PriorityBuffer则提供比一般的先进先出Buffer更强的控制力:我们可以自定义Comparator给它,告诉它怎么判定它的成员的先后顺序,优先级最高的最先走。

Comparator包已经明确定了一个java.util.Comparator接口,只是有很多人并不了解,Commons Collections也只是扩展了这个接口而已。这个java.util.Comparator定义如下核心方法:

1publicintcompare(Object arg0, Object arg1)

传给它两个对象,它要告诉我们这两个对象哪一个在特定的语义下更“大”,或者两者相等。如果arg0 > arg1,返回大于0的整数;如果arg0 = arg1,返回0;如果arg0 < arg2,返回小于0的整数。

我们看看Commons Collections给我们提供了哪些Comparator的实现类(都在org.apache.commons.collections.comparators包下面):

BooleanComparator – 用于排序一组 Boolean 对象,指明先 true 还是先 false ;

ComparableComparator – 用于排序实现了 java.lang.Comparable 接口的对象(我们常用的 Java 类如 String 、 Integer、 Date 、 Double 、 File 、 Character 等等都实现了 Comparable 接口);

ComparatorChain – 定义一组 Comparator 链,链中的 Comparator 对象会被依次执行;

FixedOrderComparator – 用于定义一个特殊的顺序,对一组对象按照这样的自定义顺序进行排序;

NullComparator – 让 null 值也可参与比较,可以设定为先 null 或者后 null ;

ReverseComparator – 将原有的 Comparator 效果反转;

TransformingComparator – 将一个 Comparator 装饰为具有 Transformer 效果的 Comparator 。

// 有关 Transformer 的内容会在以后的笔记中讲到。

以上除了ComparatorChain之外,似乎都是实现一些很基本的比较方法,但是当我们用ComparatorChain将一组Comparator串起来之后,就可以实现非常灵活的比较操作。

在Predicate包中Predicate是Commons Collections中定义的一个接口,可以在org.apache.commons.collections包中找到。其中定义的方法签名如下:

1publicbooleanevaluate(Object object)

它以一个Object对象为参数,处理后返回一个boolean值,检验某个对象是否满足某个条件。其实这个Predicate以及上一篇笔记提到的Comparator还有我们即将看到的Transformer和Closure等都有些类似C/C++中的函数指针,它们都只是提供简单而明确定义的函数功能而已。

跟其他组类似,Commons Collections也提供了一组定义好的Predicate类供我们使用,这些类都放在org.apache.commons.collections.functors包中。当然,我们也可以自定义Predicate,只要实现这个Predicate接口即可。在Commons Collections中我们也可以很方便使用的一组预定义复合Predicate,我们提供2个或不定数量个Predicate,然后交给它,它可以帮我们处理额外的逻辑,如AndPredicate处理两个Predicate,只有当两者都返回true它才返回true;AnyPredicate处理多个Predicate,当其中一个满足就返回true,等等。

而我们有时候需要将某个对象转换成另一个对象供另一组方法调用,而这两类对象的类型有可能并不是出于同一个继承体系的,或者说出了很基本的Object之外没有共同的父类,或者我们根本不关心他们是不是有其他继承关系,甚至就是同一个类的实例只是对我们而言无所谓,我们为了它能够被后续的调用者有意义的识别和处理,在这样的情形,我们就可以利用Transformer。除了基本的转型Transformer之外,Commons Collections还提供了Transformer链和带条件的Transformer,使得我们很方便的组装出有意义的转型逻辑。

Closure这一组接口和类提供一个操作对象的execute方法,为我们在处理一系列对象时可以将处理逻辑分离出来。理论上讲,使用Transformer也可以达到类似的效果,只要输出对象和输入对象是同一个对象就好,但是Closure接口定义的execute方法返回void,并且从效果和功能区分上,Closure可以更好的诠释对象处理或执行的意思。而事实上,ClosureUtils中也提供了一个asClosure方法包装一个现成的Transformer。

最后提到的java.util.Iterator接口定义了标准的Collection遍历方法,但是如果不做改变的使用它,我们得到的是从头到尾一次性的遍历。假如我们需要循环遍历,假如我们需要遍历某一段,假如我们需要遍历满足某些条件的元素,等等等等,我们就不能完全依赖于这个Iterator的标准实现了。除非我们宁可在此基础上在调用的代码中多加一些判断,不过这样的话代码就会显得混乱,时间长了就容易变得难以维护。Commons Collections的这一组Iterator为我们带来了便利。
Apache Commons包含了很多开源的工具,用于解决平时编程经常会遇到的问题,减少重复劳动。篇幅很长所以拆分为两篇。

组件 功能介绍
Utility classes 包括一些静态方法来执行常用任务
Input InputStream 和 Reader 实现
collections java集合框架操作.
configuration 一个java应用程序的配置管理类库.
io io工具的封装.
lang Java基本对象方法的工具类包 如:StringUtils,ArrayUtils等等.
logging 提供的是一个Java 的日志接口.
net 提供了客户端和服务器端的数据验证框架.


四.configuration
1.Properties files
2.XML documents
3.Property list files (.plist)
4.JNDI
5.JDBC Datasource
6.System properties
7.Applet parameters
8.Servlet parameters
9.

Apache Common-Configuration 工具可以从Properties文件,XML文件,JNDI,JDBC数据源,System Properties,Applet parameters,Servlet Parameters等读取相应信息。

具体的使用方式:

1.引入jar包。引入commons-configuration(版本1.XX和2.XX的使用方式稍有区别)和commons-beanutils两个依赖;
2.初始化配置
版本1.XX

# 使用有参构造来加载配置文件
Configuration config = new PropertiesConfiguration(“usergui.properties”);
# 使用无参构造初始化,然后通过load()方法来加载配置文件
Configuration config = new PropertiesConfiguration();

版本2.XX

Configurations configs = new Configurations();
try{
Configuration config = configs.properties(new File(“config.properties”));
// access configuration properties
String dbHost = config.getString(“database.host”);
String dbPassword = config.getString(“database.password”, “secret”); // provide a default
int dbPort = config.getInt(“database.port”);
long dbTimeout = config.getLong(“database.timeout”);

}catch (ConfigurationException cex){
// Something went wrong
}

注意:access configuration properties的异常

在获取properties文件的内容时:

如果key不存在,且获取的类型为String类型时,那么返回值为null;

如果key不存在,且获取的类型为非String类型时,那么将抛出一个Exception: java.util.NoSuchElementException

还可以指定一个默认的值,在找不到指定key的时候,Configuration将使用这个默认值, Configuration为每个取值的方法都提供了重载的方法。

3.扫描规则

版本1.XX

i 如果指定的是绝对路径按绝对路径扫描

ii 如果指定的是相对路径,那么按如下顺序扫描

1.in the current directory
2.in the user home directory
3.in the classpath

版本2.XX

在Version 2.0开始,对于文件扫描策略,用接口FileLocationStrategy来实现,该接口只有一个单一的方法locate()

URL locate(FileSystem fileSystem, FileLocator locator);

一共提供了如下几个实现类,分别来应对不同的场景。

ProvidedURLLocationStrategy,

FileSystemLocationStrategy,

AbsoluteNameLocationStrategy,

BasePathLocationStrategy,

HomeDirectoryLocationStrategy,

ClasspathLocationStrategy,

CombinedLocationStrategy。

同时, 这些实现类可以构成一个扫描链来进行按照其顺序进行组合扫描。假设我们期望按照如下的顺序进行扫描我们的配置文件:

1.by their URL
2.by the file system (which will evaluate base path and file name)
3.on the classpath

代码实现如下:

List subs = Arrays.asList(
new ProvidedURLLocationStrategy(),
new FileSystemLocationStrategy(),
new ClasspathLocationStrategy());
FileLocationStrategy strategy = new CombinedLocationStrategy(subs);

4.自动重载配置文件

我们都希望我们的系统是高可用的,在我们修改配置文件的以后,不期望去重新启动服务,而希望其能够自动的重新加载。Commons-Configuration提供了一些组件来实现这一功能。

组件一:ReloadingDetector Interface

组件二:ReloadingController Class , ReloadingListener Interface

因为Commons-Configuration无法得知每个用户的期望触发重新加载的机制,所以其设计一个基于Timer的方案,作为一个最灵活的方式,同时它有提供了一个自定义触发器( a custom component triggering)组件的方法来适配各种不同的重载需求。

四.io

commons-io是一款处理io流的工具,封装了很多处理io流和文件的方法,可以大大简化我们处理io流和操作文件的代码。从common-io的官方使用文档可以看出,它主要分为工具类、尾端类、行迭代器、文件过滤器、文件比较器和扩展流,它包含有:

组件 功能介绍
Utility classes 包括一些静态方法来执行常用任务
Input InputStream 和 Reader 实现
Output OutputStream 和 Writer 实现
Filters 多种文件过滤器实现(定义了 IOFileFilter接口,同时继承了 FileFilter 和 FilenameFilter 接口)
Comparators 用于文件比较的多种java.util.Comparatot实现


1.IOUtils

IOUtils 包含一些工具类,用于处理读,写和拷贝,这些方法基于 InputStream, OutputStream, Reader 和 Writer工作.

例如,思考一个任务,从URL中读取byte数据,并打印。通常会这样做:

InputStream in = new URL( “http://commons.apache.org“ ).openStream();
try{
InputStreamReader inR = new InputStreamReader( in );
BufferedReader buf = new BufferedReader( inR );
String line;
while ( ( line = buf.readLine() ) != null ) {
System.out.println( line );
}
}finally{
in.close();
}

使用 IOUtils类,可以这样:

InputStream in = new URL( “http://commons.apache.org“ ).openStream();
try{
System.out.println( IOUtils.toString( in ) );
}finally{
IOUtils.closeQuietly(in);
}
}

在某些应用领域,例如IO操作中是很常见的,这个类可以节省很多时间。并且你可以依赖于经过全面测试的代码。对于这类的代码,灵活性和速度是最重要的。然而你也应该明白这么做的限制。使用以上的方式读取一个1GB的文件将会试图创造一个1GB字符串对象。

2.FileUtils

FileUtils 包含一些工具类,它们基于File对象工作,包括读,写,拷贝和比较文件。例如逐行读取整个文件你可以使用:

File file = new File(“/commons/io/project.properties”);
List lines = FileUtils.readLines(file, “UTF-8”);

3.FilenameUtils

FilenameUtils包含一些工具类,它们基于文件名工作而不是File对象。这个类旨在 在Unix和Windows环境下保持一致,帮助在两个环境下过渡(如从开发环境到生成环境)。例如,正常化文件名,删除片段:

String filename = “C:/commons/io/../lang/project.xml”;
String normalized = FilenameUtils.normalize(filename);
// result is “C:/commons/lang/project.xml”

4.FileSystemUtils

FileSystemUtils包含一些工具类,基于文件系统访问功能不被JDK支持。目前,只有一个方法就是得到驱动器空余空间。注意这使用命令行而不是 native code。例如得到驱动器空余空间:

long freeSpace = FileSystemUtils.freeSpace(“C:/“);
Endian classes

不同的计算机架构对应字节序采用不同的约定,在所谓的”小端”架构(例如Intel),低位字节被存储在内存的最低字节,之后的字节在高地址。对于”大端”架构(如Motoroal),情况相反。在这个包中有两个相关联的类:

EndianUtils 包含静态方法来交换Java基本类型和流的字节序

SwappedDataInputStream实现了DataInput接口。可以从文件中读取非本地字节序。

5.Line iterator

org.apache.commons.io.LineIterator类提供类灵活的方式操作基于行的文件。通过FileUtils 或 IOUtils中的工厂方法,可以直接创建一个实例。推荐的使用方法是:

LineIterator it = FileUtils.lineIterator(file, “UTF-8”);
try{
while(it.hasNext()){
String line = it.nextLine();
// do something with line
}finally{
LineIterator.closeQuietly(iterator);
}
}

6.File filters

org.apache.commons.io.filefilter包定义了一个接口 (IOFileFilter),同时继承了 java.io.FileFilter 和 java.io.FilenameFilter接口。除此之外还提供了一系列可以使用的IOFileFilter接口实现,包括允许你组合其他过滤器。这些过滤器可以用来遍历文件或在FileDialog中使用。详情见 filefilter 包的Javadoc。

7.File comparators

org.apache.commons.io.comparator包为java.io.File提供一些java.util.Comparator实现。这些比较器可以用来排序列表和文件数字。详情见 comparator 包的Javadoc。

8.Streams

org.apache.commons.io.input 和 org.apache.commons.io.output 包中包含一些有用的流实现。他们包括:

Null output stream – 默默吸收所有发给它的数据

Tee output stream – 发送输出数据给两个流而不是一个

Byte array output stream – 这是一个比JDK更快的版本

Counting streams – 计算通过的字节数

Proxy streams – 在代理中委托正确的方法

Lockable writer – 使用锁文件提供写入同步

六.lang
主要是一些公共的工具集合,比如对字符、数组的操作等等。

组件 功能介绍
builder 包含了一组用于产生每个Java类中都常使用到的toString()、 hashCode()、equals()、compareTo()等等方法的构造器
enums 用于处理枚举
exception 用于处理Java标准API中的exception,为1.4之前版本提供Nested Exception功能
math 用于处理数学相关
mutable 用于包装易变值类型的变量
reflect 反射相关
text 提供处理文本的功能
time 提供处理日期和时间的功能


静态类

在org.apache.commons.lang包中提供了一些有用的包含static方法的Util类。除了6个Exception类和2个已经deprecated的数字类之外,commons.lang包共包含了17个实用的类。

类名 作用
ArrayUtils 用于对数组的操作,如添加、查找、删除、子数组、倒序、元素类型转换等
BitField 用于操作位元,提供了一些方便而安全的方法
BooleanUtils 用于操作和转换boolean或者Boolean及相应的数组
CharEncoding 包含了Java环境支持的字符编码,提供是否支持某种编码的判断
CharRange 用于设定字符范围并做相应检查
CharSet 用于设定一组字符作为范围并做相应检查
CharSetUtils 用于操作CharSet
CharUtils 用于操作char值和Character对象
ClassUtils 用于对Java类的操作,不使用反射
ObjectUtils 用于操作Java对象,提供null安全的访问和其他一些功能
RandomStringUtils 用于生成随机的字符串
SerializationUtils 用于处理对象序列化,提供比一般Java序列化更高级的处理能力
StringEscapeUtils 用于正确处理转义字符,产生正确的Java、JavaScript、HTML、XML和SQL代码
StringUtils 处理String的核心类,提供了相当多的功能
SystemUtils 在java.lang.System基础上提供更方便的访问,如用户路径、Java版本、时区、操作系统等判断
Validate 提供验证的操作,有点类似assert断言
WordUtils 用于处理单词大小写、换行等


七.logging

提供的是一个Java 的日志接口,同时兼顾轻量级和不依赖于具体的日志实现工具。


Commons-logging(JCL)是apache最早提供的日志的门面接口。提供简单的日志实现以及日志解耦功能。JCL能够选择使用Log4j(或其他如slf4j等)还是JDK Logging,但是他不依赖Log4j,JDK Logging的API。如果项目的classpath中包含了log4j的类库,就会使用log4j,否则就使用JDK Logging。使用commons-logging能够灵活的选择使用那些日志方式,而且不需要修改源代码。(类似于JDBC的API接口)。

类名 作用
AvalonLogger 阿瓦隆日志
Jdk13LumberjackLogger JDK1.3日志
Jdk14Logger JDK1.4日志
Log4JLogger log4j日志
LogKitLogger logkit日志
NoOpLog common-logging 自带日志实现类。它实现了 Log 接口。 其输出日志的方法中不进行任何操作。
SimpleLog common-logging 自带日志实现类


使用方法

1)将common-logging.jar 包加入到环境变量或者classpath。

2)导入org.apache.commons.logging.Log; org.apache.commons.logging.LogFactory;及相关包

3)在需要使用logging的地方获取Log实例。

private static Log log = LogFactory.getLog(Test.class);

4)使用Logger对象的debug,info,fatal…方法。

log.debug(“Debug info.”);

老八:commons-net

Apache Commons Net™库实现了许多基本Internet协议的客户端。该库的目的是提供基本协议访问,而不是更高级别的抽象。因此,一些设计违反了面向对象的设计原则。我们的理念是尽可能使协议的全局功能可访问(例如,TFTP发送文件和接收文件),但也提供对适用的基本协议的访问,以便程序员可以构建自己的自定义实现(例如,TFTP)数据包类和TFTP数据包的发送和接收方法都是公开的)。

支持协议:

· FTP / FTPS
· FTP over HTTP(实验性)
· NNTP 网络新闻传输协议
· SMTP(S)简单邮件传输协议
· POP3(S)邮件协议版本3
· IMAP(S)邮件访问协议
· telnet 远程登录
· TFTP 简单文件传输协议
· finger
· whois 用来查询域名的IP以及所有者等信息的传输协议
· REXEC / RCMD /远程登录
· daytime(rdate)和白天
· echo
· discard
· NTP / SNTP 网络时间协议

小知识复习

TCP和UDP的区别:

1.基于连接与无连接;

2.对系统资源的要求(TCP较多,UDP少);

3.UDP程序结构较简单;

4.流模式与数据报模式 ;

5.TCP保证数据正确性,UDP可能丢包,TCP保证数据顺序,UDP不保证。

九.Betwixt

XML与Java对象之间相互转换。

十.Compress

commons compress中的打包、压缩类库。

//创建压缩对象
ZipArchiveEntry entry = new ZipArchiveEntry(“CompressTest”);
//要压缩的文件
File f=new File(“e:\test.pdf”);
FileInputStream fis=new FileInputStream(f);
//输出的对象 压缩的文件
ZipArchiveOutputStream zipOutput=new ZipArchiveOutputStream(new File(“e:\test.zip”));
zipOutput.putArchiveEntry(entry);
int i=0,j;
while((j=fis.read()) != -1)
{
zipOutput.write(j);
i++;
System.out.println(i);
}
zipOutput.closeArchiveEntry();
zipOutput.close();
fis.close();
十一.DBCP

(Database Connection Pool)是一个依赖Jakarta commons-pool对象池机制的数据库连接池,Tomcat的数据源使用的就是DBCP。

十二.DbUtils
Apache组织提供的一个资源JDBC工具类库,它是对JDBC的简单封装,对传统操作数据库的类进行二次封装,可以把结果集转化成List。,同时也不影响程序的性能。
DbUtils类:启动类
ResultSetHandler接口:转换类型接口
MapListHandler类:实现类,把记录转化成List
BeanListHandler类:实现类,把记录转化成List,使记录为JavaBean类型的对象
Qrery Runner类:执行SQL语句的类


十三.Email

提供的一个开源的API,是对javamail的封装。

十四.FileUpload

java web文件上传功能。

十五.HttpClient

基于HttpCore实 现的一个HTTP/1.1兼容的HTTP客户端,它提供了一系列可重用的客户端身份验证、HTTP状态保持、HTTP连接管理module。

十六.Validate
通用验证系统,该组件提供了客户端和服务器端的数据验证框架。
1.验证日期
2.验证表达式
3.配置文件中使用验证
4.验证类

其它所以的组件

主页推荐
BCEL
字节码工程库——分析、创建和操作Java类文件
BeanUtils
围绕Java反射和自省api的易于使用的包装器。
BSF
Bean脚本框架-脚本语言的接口,包括JSR-223
Chain
责任链模式的实施。
CLI
命令行参数分析器。
Codec
一般的编码/解码算法(例如语音、base64、URL)。
Collections
扩展或增强Java集合框架。
Compress
定义用于处理tar、zip和bzip2文件的API。
Configuration
读取各种格式的配置/首选项文件。
Crypto
一个加密库优化与AES-NI包装Openssl或JCE算法的实现。
CSV
组件,用于读写逗号分隔的值文件。
Daemon
类unix守护进程java代码的替代调用机制。
DBCP
数据库连接池服务。
DbUtils
JDBC助手库。
Digester
XML-to-Java-object映射工具。
Email
用于从Java发送电子邮件的库。
Exec
用于处理Java中的外部流程执行和环境管理的API。
FileUpload
您的servlet和web应用程序的文件上载功能。
Functor
函子是一个函数,可以作为一个对象来操作,也可以作为一个对象来表示单个泛型函数。
Geometry
和空间坐标。
Imaging (previously called Sanselan)
一个纯java映像库
IO
I/O实用程序的集合。
JCI
Java编译器接口
JCS
Java缓存系统
Jelly
基于XML的脚本和处理引擎。
Jexl
表达式语言,它扩展了JSTL的表达式语言。
JXPath
使用XPath语法操作Java bean的实用程序。
Lang
为java.lang中的类提供额外的功能。
Logging
包装各种日志API实现。
Math
轻量级、自包含的数学和统计组件。
Net
网络实用程序和协议实现的集合。
Numbers
数字类型(复数、四元数、分数)和实用程序(数组、组合学)。
OGNL
一种对象图导航语言
Pool
通用对象池组件
Proxy
用于创建动态代理的库。
RDF
可以由JVM上的系统实现的RDF 1.1的通用实现。
RNG
随机数生成器的实现。
SCXML
一种状态图XML规范的实现,旨在创建和维护Java SCXML引擎。它能够执行使用SCXML文档定义的状态机,并抽象出环境接口。
Statistics
统计
Text
Apache Commons Text是一个专注于处理字符串的算法的库。
Validator
在xml文件中定义验证器和验证规则的框架。
VFS
虚拟文件系统组件,用于处理文件、FTP、SMB、ZIP等类似于单个逻辑文件系统的文件。
Weaver
提供一种简单的方法来增强(编织)编译的字节码。
Apache Commons项目与许多其他Apache托管项目不同,因为它由多个独立发布的包组成。此页面提供了当前可用的通用组件的概述。
BCEL
字节码工程库——分析、创建和操作Java类文件
BeanUtils
围绕Java反射和自省api的易于使用的包装器。
BSF
Bean脚本框架-脚本语言的接口,包括JSR-223
Chain
责任链模式的实施。
CLI
命令行参数分析器。
Codec
一般的编码/解码算法(例如语音、base64、URL)。
Collections
扩展或增强Java集合框架。
Compress
定义用于处理tar、zip和bzip2文件的API。
Configuration
读取各种格式的配置/首选项文件。
Crypto
一个加密库优化与AES-NI包装Openssl或JCE算法的实现。
CSV
组件,用于读写逗号分隔的值文件。
Daemon
类unix守护进程java代码的替代调用机制。
DBCP
数据库连接池服务。
DbUtils
JDBC助手库。
Digester
XML-to-Java-object映射工具。
Email
用于从Java发送电子邮件的库。
Exec
用于处理Java中的外部流程执行和环境管理的API。
FileUpload
您的servlet和web应用程序的文件上载功能。
Functor
函子是一个函数,可以作为一个对象来操作,也可以作为一个对象来表示单个泛型函数。
Geometry
和空间坐标。
Imaging (previously called Sanselan)
一个纯java映像库
IO
I/O实用程序的集合。
JCI
Java编译器接口
JCS
Java缓存系统
Jelly
基于XML的脚本和处理引擎。
Jexl
表达式语言,它扩展了JSTL的表达式语言。
JXPath
使用XPath语法操作Java bean的实用程序。
Lang
为java.lang中的类提供额外的功能。
Logging
包装各种日志API实现。
Math
轻量级、自包含的数学和统计组件。
Net
网络实用程序和协议实现的集合。
Numbers
数字类型(复数、四元数、分数)和实用程序(数组、组合学)。
OGNL
一种对象图导航语言
Pool
通用对象池组件
Proxy
用于创建动态代理的库。
RNG
随机数生成器的实现。
SCXML
一种状态图XML规范的实现,旨在创建和维护Java SCXML引擎。它能够执行使用SCXML文档定义的状态机,并抽象出环境接口。
Statistics
统计
Text
Apache Commons Text是一个专注于处理字符串的算法的库。
Validator
在xml文件中定义验证器和验证规则的框架。
VFS
虚拟文件系统组件,用于处理文件、FTP、SMB、ZIP等类似于单个逻辑文件系统的文件。
Weaver
提供一种简单的方法来增强(编织)编译的字节码。
沙箱是一个Subversion存储库,供公共提交者作为共享和协作的开放工作区使用。沙箱作为项目的集散地,它的目标是所谓的公共用地。
BeanUtils2
重新设计的公共豆芽。
ClassScan
在不加载的情况下查找类接口、方法、字段和注释。
CLI2
公共CLI的重新设计。
Convert
common - convert旨在提供一个单独的库,用于将一种类型的对象转换为另一种类型的对象。
Finder
受UNIX find命令启发的Java库
Flatfile
用于处理平面数据结构的Java库。
Graph
一个通用的图形api和算法。
I18n
添加本地化消息包的特性,该消息包由一个或多个属于同一文本的本地化文本组成。考虑由标题、文本、摘要和错误细节组成的错误消息。
Id
Id是用于生成标识符的组件。
Inject
JSR 330的实现,一个符合标准的依赖注入框架
Javaflow
获取应用程序状态的延续实现。
JNet
JNet允许通过java.net API动态注册url流处理程序。
Monitoring
监视的目的是为Java应用程序提供一个简单但可扩展的监视解决方案。
Nabla
Nabla提供了自动区分类,可以生成用Java语言实现的任何函数的派生。
OpenPGP
使用OpenPGP对数据进行签名和验证的接口。
Performance
一个用于微基准测试客户端的小框架,实现了公共DBCP和池。
Pipeline
提供一组围绕工作队列设计的管道实用程序,这些工作队列与顺序处理数据对象的数据对象并行运行。