为了账号安全,请及时绑定邮箱和手机立即绑定

apache-commons家族的八兄弟(下)

标签:
Java

Apache Commons包含了很多开源的工具,用于解决平时编程经常会遇到的问题,减少重复劳动。篇幅很长所以拆分为两篇。

组件

功能介绍

Utility classes

包括一些静态方法来执行常用任务

Input 

InputStream 和 Reader 实现

collections

java集合框架操作.

configuration

一个java应用程序的配置管理类库.

io

io工具的封装.

lang

Java基本对象方法的工具类包 如:StringUtils,ArrayUtils等等.

logging

提供的是一个Java 的日志接口.

net

提供了客户端和服务器端的数据验证框架.

 

老四:commons-configuration

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<FileLocationStrategy> 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)组件的方法来适配各种不同的重载需求。

老四:commons-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 – 使用锁文件提供写入同步

老六: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 

用于处理单词大小写、换行等

老七:commons-logging

       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不保证。

https://img1.sycdn.imooc.com//5c517174000170ca09150565.jpg

点击查看更多内容
3人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
JAVA开发工程师
手记
粉丝
55
获赞与收藏
242

关注作者,订阅最新文章

阅读免费教程

感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消