Apache Commons包含了很多开源的工具,用于解决平时编程经常会遇到的问题,减少重复劳动。篇幅很长所以拆分为两篇。
组件 |
功能介绍 |
Utility classes |
包括一些静态方法来执行常用任务 |
Input |
InputStream 和 Reader 实现 |
collections |
java集合框架操作. |
configuration |
一个java应用程序的配置管理类库. |
io |
io工具的封装. |
lang |
Java基本对象方法的工具类包 如:StringUtils,ArrayUtils等等. |
logging |
提供的是一个Java 的日志接口. |
net |
提供了客户端和服务器端的数据验证框架. |
Apache Common-Configuration 工具可以从Properties文件,XML文件,JNDI,JDBC数据源,System Properties,Applet parameters,Servlet Parameters等读取相应信息。
具体的使用方式:
引入jar包。引入commons-configuration(版本1.XX和2.XX的使用方式稍有区别)和commons-beanutils两个依赖;
初始化配置
版本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 如果指定的是相对路径,那么按如下顺序扫描
in the current directory
in the user home directory
in the classpath
版本2.XX
在Version 2.0开始,对于文件扫描策略,用接口FileLocationStrategy来实现,该接口只有一个单一的方法locate()
URL locate(FileSystem fileSystem, FileLocator locator);
一共提供了如下几个实现类,分别来应对不同的场景。
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);
4.自动重载配置文件
我们都希望我们的系统是高可用的,在我们修改配置文件的以后,不期望去重新启动服务,而希望其能够自动的重新加载。Commons-Configuration提供了一些组件来实现这一功能。
组件一:ReloadingDetector Interface
组件二:ReloadingController Class , ReloadingListener Interface
因为Commons-Configuration无法得知每个用户的期望触发重新加载的机制,所以其设计一个基于Timer的方案,作为一个最灵活的方式,同时它有提供了一个自定义触发器( a custom component triggering)组件的方法来适配各种不同的重载需求。
ommons-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);
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();
}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 – 使用锁文件提供写入同步
组件 |
功能介绍 |
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 |
用于处理单词大小写、换行等 |
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.");
Apache Commons Net™库实现了许多基本Internet协议的客户端。该库的目的是提供基本协议访问,而不是更高级别的抽象。因此,一些设计违反了面向对象的设计原则。我们的理念是尽可能使协议的全局功能可访问(例如,TFTP发送文件和接收文件),但也提供对适用的基本协议的访问,以便程序员可以构建自己的自定义实现(例如,TFTP)数据包类和TFTP数据包的发送和接收方法都是公开的)。老八:commons-net
支持协议:
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不保证。