天天看点

Apache Commons的小结

看文时发现老铁一句“不了解Apache Commons的java程序员不算java程序员”,瞬间扎铁了。赶紧搜了一下,发现这里面有些类是用过的,只是没有对它有个总体的印象

看了部分相关使用博文中互相复制粘贴失了原有的格式。本文主要目的为整理常用类,成为自用的一个快速搜索列表。

最近的一篇关于这个工具包的博文是《apache-commons家族的八兄弟》

主要列出了

组件 功能介绍
beanUtils 提供了对于JavaBean进行各种操作,克隆对象,属性等等.
codec 处理常用的编码方法的工具类包 例如DES、SHA1、MD5、Base64等.
collections java集合框架操作.
configuration 一个java应用程序的配置管理类库.
io io工具的封装.
lang Java基本对象方法的工具类包 如:StringUtils,ArrayUtils等等.
logging 提供的是一个Java 的日志接口.
net 提供了客户端和服务器端的数据验证框架.

另一篇博文是https://blog.csdn.net/zs064811/article/details/51601912

组件 功能介绍
BeanUtils 提供了对于JavaBean进行各种操作,克隆对象,属性等等.
Betwixt XML与Java对象之间相互转换.
Codec 处理常用的编码方法的工具类包 例如DES、SHA1、MD5、Base64等.
Collections java集合框架操作.
Compress java提供文件打包 压缩类库.
Configuration 一个java应用程序的配置管理类库.
DBCP 提供数据库连接池服务.
DbUtils 提供对jdbc 的操作封装来简化数据查询和记录读取操作.
Email java发送邮件 对javamail的封装.
FileUpload 提供文件上传功能.
HttpClien 提供HTTP客户端与服务器的各种通讯操作. 现在已改成HttpComponents
IO io工具的封装.
Lang Java基本对象方法的工具类包 如:StringUtils,ArrayUtils等等.
Logging 提供的是一个Java 的日志接口.
Validator 提供了客户端和服务器端的数据验证框架.

1.BeanUtils

文章基本都把它列为最重要的部分。应用及其广泛。

主要用来组装对象,包含设置、赋值、克隆的一系列操作。只有你想不到,没有他没写到。

这里我注意了一点,和我用过的反射机制一样,可以通过PropertyUtils获取私有属性的值。

另外有文章说Struts的创始人Craig McClanahan是BeanUtils的作者之一。难怪用的时候让我不停地想起曾经折腾过得的配置javabean。

2.Codec

第二个讲的是Codec,本质上就是编码解码,加密解密,encode,decode,方法名称都和以前用过得很接近。

广泛地使用Base64, Hex, MD5,Phonetic and URLs

3.Collections

这个包也是个重量级的工具了,看了一个不错的分类方式:

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

=未完待续=

##4.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

    PropertiesConfiguration config = new PropertiesConfiguration(“usergui.properties”);

    config.setProperty(“colors.background”, "#000000);

    config.save();

    config.save("usergui.backup.properties);//save a copy

    Integer integer = config.getInteger(“window.width”);

5.IO

正常的缓冲流套输入输出流

//标准代码:

InputStream in = new URL( “http://jakarta.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://jakarta.apache.org” ).openStream();

try {

System.out.println( IOUtils.toString( in ) );

} finally {

IOUtils.closeQuietly(in);

}

//2.读取文件  
File file = new File("/commons/io/project.properties");  
List lines = FileUtils.readLines(file, "UTF-8");  
//3.察看剩余空间  
long freeSpace = FileSystemUtils.freeSpace("C:/"); 
           

6.Lang

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

// 1 合并两个数组: org.apache.commons.lang. ArrayUtils

// 有时我们需要将两个数组合并为一个数组,用ArrayUtils就非常方便,示例如下:

private static void testArr() {

String[] s1 = new String[] { “1”, “2”, “3” };

String[] s2 = new String[] { “a”, “b”, “c” };

String[] s = (String[]) ArrayUtils.addAll(s1, s2);

for (int i = 0; i < s.length; i++) {

System.out.println(s[i]);

}

String str = ArrayUtils.toString(s);

str = str.substring(1, str.length() - 1);

System.out.println(str + “>>” + str.length());

}

//2 截取从from开始字符串

StringUtils.substringAfter("SELECT * FROM PERSON ", “from”);

//3 判断该字符串是不是为数字(0~9)组成,如果是,返回true 但该方法不识别有小数点和 请注意

StringUtils.isNumeric(“454534”); //返回true

//4.取得类名

System.out.println(ClassUtils.getShortClassName(Test.class));

//取得其包名

System.out.println(ClassUtils.getPackageName(Test.class));

//5.NumberUtils  
       System.out.println(NumberUtils.stringToInt("6"));  
       //6.五位的随机字母和数字  
       System.out.println(RandomStringUtils.randomAlphanumeric(5));  
       //7.StringEscapeUtils  
       System.out.println(StringEscapeUtils.escapeHtml("<html>"));  
       //输出结果为&lt;html&gt;  
       System.out.println(StringEscapeUtils.escapeJava("String"));  
        
       //8.StringUtils,判断是否是空格字符  
       System.out.println(StringUtils.isBlank("   "));  
       //将数组中的内容以,分隔  
       System.out.println(StringUtils.join(test,","));  
       //在右边加下字符,使之总长度为6  
       System.out.println(StringUtils.rightPad("abc", 6, 'T'));  
       //首字母大写  
       System.out.println(StringUtils.capitalize("abc"));  
       //Deletes all whitespaces from a String 删除所有空格  
       System.out.println( StringUtils.deleteWhitespace("   ab  c  "));  
       //判断是否包含这个字符  
       System.out.println( StringUtils.contains("abc", "ba"));  
       //表示左边两个字符  
       System.out.println( StringUtils.left("abc", 2));  
       System.out.println(NumberUtils.stringToInt("33"));  
           

7.logging

其实没什么必要,业界多半用log4j logback等

log.error(“ERROR”);

log.debug(“DEBUG”);

log.warn(“WARN”);

log.info(“INFO”);

log.trace(“TRACE”);

8.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 网络时间协议

  • FTP/FTPS
  • FTP over HTTP (experimental)
  • NNTP
  • SMTP(S)
  • POP3(S)
  • IMAP(S)
  • Telnet
  • TFTP
  • Finger
  • Whois
  • rexec/rcmd/rlogin
  • Time (rdate) and Daytime
  • Echo
  • Discard
  • NTP/SNTP

其他.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();

其他.FileUpload

//官方示例:  
//* 检查请求是否含有上传文件  
    // Check that we have a file upload request  
    boolean isMultipart = ServletFileUpload.isMultipartContent(request);  
  
    //现在我们得到了items的列表  
  
    //如果你的应用近于最简单的情况,上面的处理就够了。但我们有时候还是需要更多的控制。  
    //下面提供了几种控制选择:  
    // Create a factory for disk-based file items  
    DiskFileItemFactory factory = new DiskFileItemFactory();  
  
    // Set factory constraints  
    factory.setSizeThreshold(yourMaxMemorySize);  
    factory.setRepository(yourTempDirectory);  
  
    // Create a new file upload handler  
    ServletFileUpload upload = new ServletFileUpload(factory);  
  
    // 设置最大上传大小  
    upload.setSizeMax(yourMaxRequestSize);  
  
    // 解析所有请求  
    List /* FileItem */ items = upload.parseRequest(request);  
  
    // Create a factory for disk-based file items  
    DiskFileItemFactory factory = new DiskFileItemFactory(  
            yourMaxMemorySize, yourTempDirectory);  
  
    //一旦解析完成,你需要进一步处理item的列表。  
    // Process the uploaded items  
    Iterator iter = items.iterator();  
    while (iter.hasNext()) {  
        FileItem item = (FileItem) iter.next();  
  
        if (item.isFormField()) {  
            processFormField(item);  
        } else {  
            processUploadedFile(item);  
        }  
    }  
  
    //区分数据是否为简单的表单数据,如果是简单的数据:  
    // processFormField  
    if (item.isFormField()) {  
        String name = item.getFieldName();  
        String value = item.getString();  
        //...省略步骤  
    }  
  
    //如果是提交的文件:  
    // processUploadedFile  
    if (!item.isFormField()) {  
        String fieldName = item.getFieldName();  
        String fileName = item.getName();  
        String contentType = item.getContentType();  
        boolean isInMemory = item.isInMemory();  
        long sizeInBytes = item.getSize();  
        //...省略步骤  
    }  
  
    //对于这些item,我们通常要把它们写入文件,或转为一个流  
    // Process a file upload  
    if (writeToFile) {  
        File uploadedFile = new File(...);  
        item.write(uploadedFile);  
    } else {  
        InputStream uploadedStream = item.getInputStream();  
        //...省略步骤  
        uploadedStream.close();  
    }  
  
    //或转为字节数组保存在内存中:  
    // Process a file upload in memory  
    byte[] data = item.get();  
    //...省略步骤  
    //如果这个文件真的很大,你可能会希望向用户报告到底传了多少到服务端,让用户了解上传的过程  
    //Create a progress listener  
    ProgressListener progressListener = new ProgressListener(){  
       public void update(long pBytesRead, long pContentLength, int pItems) {  
           System.out.println("We are currently reading item " + pItems);  
           if (pContentLength == -1) {  
               System.out.println("So far, " + pBytesRead + " bytes have been read.");  
           } else {  
               System.out.println("So far, " + pBytesRead + " of " + pContentLength  
                                  + " bytes have been read.");  
           }  
       }  
    };  
    upload.setProgressListener(progressListener);  
           

其他lang.math

注意与math包的区分

在Jakarta Commons中,专门处理数学计算的类分别可以在两个地方找到:一是Commons Lang的org.apache.commons.lang.math包中,二是在Commons Math这个单独的子项目中。由于后者主要是处理复数、矩阵等。

org.apache.commons.lang.math包中共有10个类,这些类可以归纳成四组:

1.处理分数的 Fraction 类;

2.处理数值的 NumberUtils 类;

3.处理数值范围的 Range 、 NumberRange 、 IntRange 、 LongRange 、 FloatRange 、 DoubleRange 类;

4.处理随机数的 JVMRandom 和 RandomUtils 类。