Commons IO
Common IO 是一个工具库,用来帮助开发IO功能 它包括6个主要部分
- Utility classes – 包括一些静态方法来执行常用任务
- Input –
InputStream和Reader实现 - Output –
OutputStream和Writer实现 - Filters – 多种文件过滤器实现(定义了
IOFileFilter接口,同时继承了FileFilter和FilenameFilter接口) - Comparators – 用于文件比较的多种
java.util.Comparatot实现 
使用步骤:
commons-io使用步骤:
1、项目下新建lib文件夹
2、将commons-io的jar包复制到该文件夹下
3、lib上右键---Build Path---add to Build Path 即可
所有方法位于FileUtils类中,均为静态方法,可以通过类名直接调用
/**
* public static void writeStringToFile(File file, String data, String charSetName);
* public static String readFileToString(File file, String charSetName);指定编码表读取内容
* public static void copyFile(File srcFile, File destFile);拷贝文件
* public static void copyDirectory(File srcDir, File destFile); 拷贝文件夹里面的内容
* public static void copyDirectoryToDirectory(File srcDir, File destFile);拷贝整个文件夹到新的文件夹
* public static void forceDelete(File file); 删除文件
* public static void deleteDirectory(File dirFlie); 删除文件夹
*/
public class Test {
public static void main(String[] args) throws IOException { File file = new File("hello.properties");
/**
* 判断hello.properties文件是否存在,如果不存在,创建该文件
*/
if (!file.exists()) {
file.createNewFile();
} /**
* 写入字符串到指定的文件中
*/
FileUtils.writeStringToFile(file, "helloworld", "UTF-8"); /**
* 指定编码表读取内容
*/
String str = FileUtils.readFileToString(file,"UTF-8");
System.out.println(str); /**
* 复制文件,a.txt文件不存在,会自动创建该文件,将file文件里面的内容即helloworld复制到a.txt
*/
FileUtils.copyFile(file, new File("a.txt")); /**
* 复制文件夹里面的内容到新的文件夹,如果新文件夹不存在自动创建
*/
File srcDir = new File("C:\\Users\\Jack Chen\\Desktop\\新建文件夹");
File destDir = new File("C:\\Users\\Jack Chen\\Desktop\\文件夹");
FileUtils.copyDirectory(srcDir,destDir); /**
* 拷贝整个文件夹到新的文件夹,如果新文件夹不存在自动创建
*/
FileUtils.copyDirectoryToDirectory(srcDir, destDir); /**
* 删除文件
*/
FileUtils.forceDelete(file); /**
* 删除文件夹
*/
FileUtils.deleteDirectory(destDir);
}
}
发行版本
- Commons IO 2.5 (requires JDK 1.6+)
- Commons IO 2.4 (requires JDK 1.6+)
- Commons IO 2.2 (requires JDK 1.5+)
用户指南
Commons-IO 包括 工具类 (utility classes), 字节序列类 (endian classes), 行迭代器 (line iterator), 文件过滤器 (file filters),文件比较器 (file comparators) 和 流实现 (stream implementations).
Utility classes
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字符串对象
FileUtils
FileUtils 包含一些工具类,它们基于File对象工作,包括读,写,拷贝和比较文件
例如逐行读取整个文件你可以使用:
File file = new File("/commons/io/project.properties");
List lines = FileUtils.readLines(file, "UTF-8");
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"
FileSystemUtils
FileSystemUtils包含一些工具类,基于文件系统访问功能不被JDK支持。目前,只有一个方法就是得到驱动器空余空间。注意这使用命令行而不是 native code。
例如得到驱动器空余空间:
long freeSpace = FileSystemUtils.freeSpace("C:/");
Endian classes
不同的计算机架构对应字节序采用不同的约定,在所谓的”小端”架构(例如Intel),低位字节被存储在内存的最低字节,之后的字节在高地址。对于”大端”架构(如Motoroal),情况相反。
在这个包中有两个相关联的类:
- EndianUtils 包含静态方法来交换Java基本类型和流的字节序
- SwappedDataInputStream实现了
DataInput接口。可以从文件中读取非本地字节序。
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);
}
File filters
org.apache.commons.io.filefilter包定义了一个接口 (IOFileFilter),同时继承了 java.io.FileFilter 和 java.io.FilenameFilter接口。除此之外还提供了一系列可以使用的IOFileFilter接口实现,包括允许你组合其他过滤器。这些过滤器可以用来遍历文件或在FileDialog中使用。
详情见 filefilter 包的Javadoc。
File comparators
org.apache.commons.io.comparator包为java.io.File提供一些java.util.Comparator实现。这些比较器可以用来排序列表和文件数字。
详情见 comparator 包的Javadoc。
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 – 使用锁文件提供写入同步
最佳实践
本文档提供一些在IO领域的最佳实践
java.io.File
通常,你要处理文件和文件名。有很多地方可能出错:
- 一个类在Uinx下正常工作但是在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 代替字符串作为文件名。这个类提供的方法经过了良好的测试。在 FileUtil你会发现其他关于 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);
Buffering streams
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 解析器可能自己缓冲,所以装饰传递给 XML 解析器的InputStream只会拖慢的代码。如果你使用我们的 CopyUtils 或者 IOUitls你不需要另外缓冲,你使用的代码在复制过程的已经缓冲。经常检查Javadocs中的信息。另一种情况,当你向ByteArrayOutputStream中写入时,缓冲不是必须的,因为你只写入内存。
原创文章,转载请注明: 转载自并发编程网 – ifeve.com本文链接地址: Commons IO 官方文档
Commons IO的更多相关文章
- apache.commons.io.IOUtils: 一个很方便的IO工具库(比如InputStream转String)
转换InputStream到String, 比如 //引入apache的io包 import org.apache.commons.io.IOUtils; ... ...String str = IO ...
- Commons IO方便读写文件的工具类
Commons IO是apache的一个开源的工具包,封装了IO操作的相关类,使用Commons IO可以很方便的读写文件,url源代码等. 普通地读取一个网页的源代码的代码可能如下 InputStr ...
- Commons IO - IOUtils
IOUtils is a general IO stream manipulation utilities. This class provides static utility methods fo ...
- Caused by: java.lang.ClassNotFoundException: org.apache.commons.io.FileUtils
1.错误叙述性说明 警告: Could not create JarEntryRevision for [jar:file:/D:/MyEclipse/apache-tomcat-7.0.53/web ...
- Apache Commons IO 2.3 几点用法
//直接将IO流转成字符串 InputStream in = new URL( "http://jakarta.apache.org" ).openStream(); try { ...
- apache commons io包基本功能
1. http://jackyrong.iteye.com/blog/2153812 2. http://www.javacodegeeks.com/2014/10/apache-commons-io ...
- java.lang.NoSuchMethodError: org.apache.commons.io.FileUtils.getTempDirectory()Ljava/io/File;
我出现这个问题的原因是使用ueditor上传图片 如果不是commons.io的jar包缺失,就是jar包有冲突 另外:最新的ueditor(1.4.3.1)使用的是commons-io-2.4.ja ...
- java.lang.NoClassDefFoundError: org/apache/commons/io/output/DeferredFileOutputStream(转)
java.lang.NoClassDefFoundError: org/apache/commons/io/output/DeferredFileOutputStream 使用Tomcat的Manag ...
- IO与文件读写---使用Apache commons IO包提高读写效率
觉得很不错,就转载了, 作者: Paul Lin 首先贴一段Apache commons IO官网上的介绍,来对这个著名的开源包有一个基本的了解:Commons IO is a library of ...
- Apache Commons IO入门教程(转)
Apache Commons IO是Apache基金会创建并维护的Java函数库.它提供了许多类使得开发者的常见任务变得简单,同时减少重复(boiler-plate)代码,这些代码可能遍布于每个独立的 ...
随机推荐
- F2BPM流程中心RESTfull解决方案及示例
1. 引言 1.1. 应用背景 随时企业的IT系统建设越来越多,往往一个企业中形成各种独立的系统,各系统相对独立,缺乏流程支掌,为达到通过构建流程服务中心向各处应用系统提供流程服务,同时将各个独立的系 ...
- 豆瓣 jsonp 请求数据 并分页
豆瓣分页 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4 ...
- volley基本使用方法
用volley訪问server数据,不用自己额外开线程.以下样例为訪问JSONObject类型的数据,详细使用方法看代码: 首先得有volley的jar包,假设自己没有.去github上下载,然后自己 ...
- Oracle 11g OEM登录后提示“出现内部错误”
使用oem登录时提示:“出现内部错误.有关详细信息, 请查看日志文件”. 具体原因未知,发现使用SQL Plus登录一次之后,再次登录即可.
- Android 65K问题之Multidex原理分析及NoClassDefFoundError的解决方法
Android 65K问题相信困惑了不少人,尽管AS的出来能够通过分dex高速解决65K问题,可是同一时候也easy由于某些代码没有打包到MainDex里引起NoClassDefFoundError. ...
- python 005 正则表达式
. 任意字符 ^ 匹配字符串开始 $ 匹配字符串结尾 * 匹配前面出现了零次或多次 + 匹配前面出现了一次或多次 ? 匹配前面出现零次或一次 {N} 匹配前面出现了N次 {M,N} 匹配重复出现M-N ...
- poj 3461 字符串单串匹配--KMP或者字符串HASH
http://poj.org/problem?id=3461 先来一发KMP算法: #include <cstdio> #include <cstring> #include ...
- 人见人爱A+B(杭电2033)
/*人见人爱A+B Problem Description HDOJ上面已经有10来道A+B的题目了,相信这些题目以前是大家的最爱,希望今天的这个A+B能给大家带来好运.也希望这个题目能唤起大家对AC ...
- 使用printf函数实现串口信息打印——设置IAR和Keil的Options
在Keil和IAR中都可以使用printf函数,但两者设置的方法不一样.以下分别是IAR和Keil的设置. 下面是Keil的设置. 选中Options--->Target--->Code ...
- SpringCloud学习 什么是微服务(一)
关于SpringCloud,我是看了周老师的<SpringCloud与Docker微服务架构实战>之后才有了一点了解,做下记录,以供后期学习.本人知识有限,如有不对,欢迎批评 1.什么是单 ...