Apache-Commons家族的八兄弟(下)

2年前 (2022) 程序员胖胖胖虎阿
203 0 0

文接上回:Apache-Commons家族的八兄弟(上)

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

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

老六: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.");

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

      原文:https://www.imooc.com/article/273893

      作者:皮县豆福脑

      1. Java 必须掌握的Spring 注解

      2. 值得关注的9个公众号

      3. Spring 中的设计模式

      4. Apache-Commons家族

      Apache-Commons家族的八兄弟(下)

      本文分享自微信公众号 - Java后端(web_resource)。
      如有侵权,请联系 support@oschina.cn 删除。
      本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

      版权声明:程序员胖胖胖虎阿 发表于 2022年10月12日 上午2:40。
      转载请注明:Apache-Commons家族的八兄弟(下) | 胖虎的工具箱-编程导航

      相关文章

      暂无评论

      暂无评论...