Apache common-io用户指南
用户指南
Commons-io 包含utility classes,endian classes,line iterator,file filters,file comparators 以及stream implementations.
如果像要更多详细描述,请查阅javadocs.
Utility 类库
IOUtils
IOUtils 包含处理阅读、写作和复制的实用方法。这些方法在InputStream, OutputStream, Reader和Writer上可以正常工作。
举一个例子,考虑一下读取来自一个url的数据,并且打印它们。使用标准的方法是:
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);
}
在某些应用领域,他们的IO操作是很普遍的,使用这个类可以节省很多时间。你完全可以依靠行之有效的代码。
对于上面的实用代码,灵活性和速度是最重要的。不过你也应该明白这种方法的局限性。利用上述技术读1GB的文件会导致试图创造一个1GB的字符串对象呢!
FileUtils
FileUtils 类提供了一些操作文件对象的实用方法。包含读取、写入、复制和比较文件。
比如逐句读取一整个文件可以使用如下方法:
File file = new File("/commons/io/project.properties");
List lines = FileUtils.readLines(file, "UTF-8");FilenameUtils
FilenameUtils类里包含了一些方法,可以直接操作文件名而不用使用文件对象。该类的目的是保持程序在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没有提供的用于访问文件系统的实用方法。当前,只有一个用于读取硬盘空余空间的方法可用。注意这里使用命令行,而不是本地代码。
long freeSpace = FileSystemUtils.freeSpace("C:/");
Endian类库
不同的计算机体系结构使用不同约定的字节排序。在所谓的“低位优先”体系结构中(如Intel),低位字节处于内存中最低位置,而其后的字节,则处于更高的位置。在“高位优先”的体系结构中(如Motorola),这种情况恰恰相反。
这个类库上有两个相关类:
EndianUtils包含用于交换java原对象和流之间的字节序列。
SwappedDataInputStream类是DataInput接口的一个实例。使用它,可以读取非本地的字节序列。
想了解更多,请参阅http://www.cs.umass.edu/~verts/cs32/endian.html
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包定义了一个合并了java.io.FileFilter以及java.io.FilenameFilter的接口(IOFileFilter)。除此之外,这个包还提供了一系列直接可用的IOFileFilter的实现类,可以通过他们合并其它的文件过滤器。比如,这些文件过滤器可以在列出文件时使用或者在使用文件对话框时使用。
有关详细信息,请参阅filefilter包的Javadoc。
org.apache.commons.io.comparator包为java.io.File提供了一些java.util.Comparator接口的实现。例如,可以使用这些比较器对文件集合或数组进行排序。
有关详细信息,请参阅comparator包的Javadoc。
org.apache.commons.io.input和org.apache.commons.io.output包中包含的针对数据流的各种各样的的实现。包括:
•空输出流-默默吸收发送给它的所有数据
•T型输出流-全用两个输出流替换一个进行发送
•字节数组输出流-这是一个更快版本的JDK类
•计数流-计算通过的字节数
•代理流-使用正确的方法委拖
•可锁写入-使用上锁文件提供同步写入