前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Apache-Commons家族的八兄弟(下)

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

作者头像
用户1093975
发布2019-03-08 11:38:47
8090
发布2019-03-08 11:38:47
举报
文章被收录于专栏:Web项目聚集地Web项目聚集地

文接上回: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

代码语言:javascript
复制
# 使用有参构造来加载配置文件
Configuration config = new PropertiesConfiguration("usergui.properties");
# 使用无参构造初始化,然后通过load()方法来加载配置文件
Configuration config = new PropertiesConfiguration();

版本2.XX

代码语言:javascript
复制
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()

代码语言:javascript
复制
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

代码实现如下:

代码语言:javascript
复制
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数据,并打印。通常会这样做:

代码语言:javascript
复制
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类,可以这样:

代码语言:javascript
复制
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对象工作,包括读,写,拷贝和比较文件。例如逐行读取整个文件你可以使用:

代码语言:javascript
复制
File file = new File("/commons/io/project.properties");
List lines = FileUtils.readLines(file, "UTF-8");

3.FilenameUtils

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

代码语言:javascript
复制
String filename = "C:/commons/io/../lang/project.xml";
String normalized = FilenameUtils.normalize(filename);

4.FileSystemUtils

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

代码语言:javascript
复制
long freeSpace = FileSystemUtils.freeSpace("C:/");
Endian classes

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

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

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

5.Line iterator

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

代码语言:javascript
复制
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实例。

代码语言:javascript
复制
private static Log log = LogFactory.getLog(Test.class);

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

代码语言:javascript
复制
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 作者:皮县豆福脑

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-02-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Web项目聚集地 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 老四:commons-configuration
  • 老五:commons-io
  • 老六:commons-lang
  • 老七:commons-logging
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档