转载自(https://my.oschina.net/u/2000201/blog/480071)

1  概述

Commons IO是针对开发IO流功能的工具类库。

主要包括六个区域:

  • 工具类——使用静态方法执行共同任务

  • 输入——用于InputStream和Reader实现

  • 输出——用于OutputStream和Writer实现

  • 过滤器——各种文件过滤器实现

  • 比较器——各种文件的java.util.Comparator实现

  • 文件监听器——监听文件系统事件的组件

2  用户指南

Commons IO包含工具类、endian classesline iteratorfile filtersfile comparators and stream implementations.

更多详细描述见javadocs。

2.1  工具类

2.1.1  IOUtils

IOUtils包含处理读、写和复制的工具方法。方法对InputStream、OutputStream、Reader和Writer起作用。

例如,从一个URL读取字节的任务,并且打印它们:

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操作是常见的,而这个类可以节省大量的时间。你可以依靠经过良好测试的代码。

这样的实用程序代码,灵活性和速度是最重要的。但是你也应该理解这种方法的局限性。使用上述技术读取一个1 gb文件将导致试图创建一个1 gb的字符串对象!

2.1.2  FileUtils

FileUtils类包含使用File对象的工具方法。包括读写、复制和比较稳健。

读取整个文件行:

File file = new File("/commons/io/project.properties");
List lines = FileUtils.readLines(file, "UTF-8");

2.1.3  FilenameUtils

FilenameUtils类包含工具方法不需要使用File对象就可以操作文件名。该类致力于屏蔽Unix和Windows之间的不同,避免这些环境之间的转换(例如,从开发到生产)。

例如,规范文件删除双点片段:

String filename = "C:/commons/io/../lang/project.xml";
返回

2.1.4  FileSystemUtils

FileSystemUtils类包含使用JDK不支持的文件系统访问功能的工具方法。当前,只有获取驱动的空间大小的方法。注意,这是使用的命令行,而不是本地代码。

long freeSpace = FileSystemUtils.freeSpace("C:/");

2.2  Endian类

不同的计算机体系采用不同的字节排序约定。在所谓的“Little Endian”的体系结构中(例如Intel),低位字节存储在内存中较低地址,后续字节在较高地址。对于“Big EndIan”体系结构,(例如Motorola),情况恰好相反。

在关联包中有两个类:

  • EndianUtils类包含交换Java原始和流的Endian-ness的静态方法。

  • SwappedDataInputStream类是DataInput接口的实现。使用它,我们能从非本地EndIan-ness的文件读取数据。

更多细节见http://www.cs.umass.edu/~verts/cs32/endian.html

2.3  行迭代器

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

处理行
 } finally {
   LineIterator.closeQuietly(iterator);
 }

2.4  文件过滤器

org.apache.commons.io.filefilter包定义一个接口(IOFileFilter)包含java.io.FileFilter和java.io.FilenameFilter。此外,包提供一系列随时可用的IOFileFilter接口实现,包括允许你组合其它过滤器的实现。这些过滤器能用于列出文件。

2.5  文件比较器

org.apache.commons.io.comparator包提供一系列java.io.File的java.util.Comparator实现。这些比较器能用于排序文件列表和数组。

2.6  流

org.apache.commons.io.input和org.apache.commons.io.output包含各种有用的流实现。

  • 空输出流——默默的吸收发给它的所有数据。

  • Tee输出流——发送输出数据到两个流。

  • 字节输出输出流——更便捷的JDK类版本。

  • 计算流——统计传递的字节数。

  • 代理流——委托恰当的方法代理。

  • 可锁定的Writer——使用文件锁提供同步的Writer。

3  最佳实践

该文档在IO领域出现一系列“最佳实践”。

3.1  java.io.File

通常,你必须使用文件和文件名。有很多事情可能出错:

  • 一个类可以在Unix上工作但不能在Windows上工作(反之亦然)

  • 由于双重或丢失路径分隔符的无效路径

  • UNC文件名(在Windows上)不使用我的本地文件名功能函数

  • 等等

这些都是很好的理由不使用文件名作为字符串。使用java.io.File而不是处理上面的很多中情况。因此,我们最好的实践推荐使用java.io.File而不是文件名字符串避免平台依赖。

Commons-io 1.1包括一个专注于文件名处理的类——FilenameUtils。这处理许多这些文件名问题,然而,任然推荐,尽可能,使用java.io.File对象。

public static String getExtension(String filename) {
   int index = filename.lastIndexOf('.');
   if (index == -1) {
     return "";
   } else {
     return filename.substring(index + 1);
   }
}

足够简单?对的,但如果传入一个完整路径而不是一个文件名会发生什么?请看下面,完全合法的路径:“C:\Temp\documentation.new\README”。定义在上面的方法返回“new\README”,肯定不是你想要的。

请使用java.io.File而不是字符串。在FileUtils你将看到围绕java.io.File的功能函数。

不推荐:

String tmpdir = "/var/tmp";
String tmpfile = tmpdir + System.getProperty("file.separator") + "test.tmp";
InputStream in = new java.io.FileInputStream(tmpfile);

推荐:

File tmpdir = new File("/var/tmp");
File tmpfile = new File(tmpdir, "test.tmp");
InputStream in = new java.io.FileInputStream(tmpfile);

3.2  缓冲流

IO性能依赖于缓冲策略。通常,读取大小为512或1024字节的数据包速度很快,因为这些大小匹配使用在硬盘上的文件系统或文件系统缓冲中的数据包大小。但只要你多次只读取几个字节,性能肯定下降。

当你读取或输出流尤其是处理文件时确保你正确的缓冲流。只是使用BufferedInputStream装饰你的FileInputStream。

InputStream in = new java.io.FileInputStream(myfile);
try {
   in = new java.io.BufferedInputStream(in);
   in.read(.....
} finally {
   IOUtils.closeQuietly(in);
}

注意,不要缓冲已经缓冲的流。一些组件像XML解析器可以做自己的缓冲,因此不需要装饰InputStream传入XML解析器,但减慢你的代码。如果你使用CopyUtils或IOUtils不需要使用额外的缓冲流

Commons之Commons-io的更多相关文章

  1. 编写更少量的代码:使用apache commons工具类库

    Commons-configuration   Commons-FileUpload   Commons DbUtils   Commons BeanUtils  Commons CLI  Commo ...

  2. 一篇关于apache commons类库的详解

    1.1. 开篇 在Java的世界,有很多(成千上万)开源的框架,有成功的,也有不那么成功的,有声名显赫的,也有默默无闻的.在我看来,成功而默默无闻的那些框架值得我们格外的尊敬和关注,Jakarta C ...

  3. Apache Commons 工具类介绍及简单使用

    转自:http://www.cnblogs.com/younggun/p/3247261.html Apache Commons包含了很多开源的工具,用于解决平时编程经常会遇到的问题,减少重复劳动.下 ...

  4. Apache Commons 工具类简单使用

    Apache Commons包含了很多开源的工具,用于解决平时编程经常会遇到的问题,减少重复劳动.下面是我这几年做开发过程中自己用过的工具类做简单介绍. 组件 功能介绍 BeanUtils 提供了对于 ...

  5. 一篇关于apache commons类库的详解[转]

    1.1. 开篇 在Java的世界,有很多(成千上万)开源的框架,有成功的,也有不那么成功的,有声名显赫的,也有默默无闻的.在我看来,成功而默默无闻的那些框架值得我们格外的尊敬和关注,Jakarta C ...

  6. Jakarta Commons Cookbook

      Cookbook就是工具书,应该是前年看的,在中关村看的影印版,全英文,本书主要讲解了一下模块: Core:BeanUtils,Lang,Collections,logging Db:DbUtil ...

  7. Commons包详解

    Apache Commons包含了很多开源的工具,用于解决平时编程经常会遇到的问题,减少重复劳动.项目地址http://commons.apache.org/ Commons BeanUtils 提供 ...

  8. commons工具类

    转自:https://blog.csdn.net/leaderway/article/details/52387925 1.1. 开篇 在Java的世界,有很多(成千上万)开源的框架,有成功的,也有不 ...

  9. Apache Commons 工具集介绍

    Apache Commons包含了很多开源的工具,用于解决平时编程经常会遇到的问题,减少重复劳动.下面是我这几年做开发过程中自己用过的工具类做简单介绍. 组件 功能介绍 BeanUtils 提供了对于 ...

  10. Apache Commons 工具类介绍及简单使用(转载)

    原文链接 http://www.cnblogs.com/younggun/p/3247261.html Apache Commons包含了很多开源的工具,用于解决平时编程经常会遇到的问题,减少重复劳动 ...

随机推荐

  1. CH5201 数组组合【01背包】

    5201 数字组合 0x50「动态规划」例题 描述 在N个数中找出其和为M的若干个数.先读入正整数N(1<N<100)和M(1<M<10000), 再读入N个正数(可以有相同的 ...

  2. Apache 配置ArcGIS server/portal 反向代理

    背景 处于安全,负载均衡,访问加速等原因会对服务器启用反向代理.arcgis for server的默认的访问地址为http://server:6080/arcgis.这个时候端口和实例名都暴露了.可 ...

  3. php格式化输出数组

    写网页的时候经常需要在页面中打印数组,但格式特别难看,看看一个html神器吧<pre>标签,能非常标准的显示数组格式 使用的时候只需要这样打印你的数组就OK了,太好用了,神器! echo ...

  4. linux下非root用户的sudo问题

    linux下的root用户是个超级管理员,一般是不用这个用户登录进行操作的,但有时候需要root权限,又不想切换用户的话可以使用sudo命令.但是不是所有的用户都可以使用sudo命令的. 首先可能会遇 ...

  5. 前端开发 - jsBom

    一.jsBom简介 jsBom = javascript browser object modelBOM指的是浏览器对象模型 Browser Object Model,它的核心就是浏览器. 二.Bom ...

  6. log4cpp简单示例

    log4cpp简单示例 下载地址 Sample.cpp #include <iostream> #include <log4cpp/FileAppender.hh> #incl ...

  7. java爬取网页内容 简单例子(1)——使用正则表达式

    [本文介绍] 爬取别人网页上的内容,听上似乎很有趣的样子,只要几步,就可以获取到力所不能及的东西,例如呢?例如天气预报,总不能自己拿着仪器去测吧!当然,要获取天气预报还是用webService好.这里 ...

  8. Jmeter添加变量的四种方法

    一.在样本中添加同请求一起发送的参数.根据服务器设置的数据类型,来添加不同类型的参数 二.用户定义的变量 1.创建:添加->配置元件->用户定义的变量 2.作用:当前的线程组内所有Samp ...

  9. 生信-序列比较dp[未完成]

    来自:生物信息学-陈铭第二版的一个例题. 题目: 目前的代码,运行不正确,关键就是不知道怎么回溯啊,回溯怎么标记呢? #include <iostream> #include<vec ...

  10. 专项训练知识点与错题整理-nowcoder-c++

    1- 来自:http://www.cskaoyan.com/thread-595813-1-1.html 1.拷贝构造函数 转自:https://www.cnblogs.com/alantu2018/ ...