Common IO 是一个工具库,用来帮助开发IO功能 它包括6个主要部分html
InputStream
和 Reader
实现OutputStream
和 Writer
实现IOFileFilter
接口,同时继承了 FileFilter
和 FilenameFilter
接口)java.util.Comparatot
实现commons-io使用步骤:
一、项目下新建lib文件夹
二、将commons-io的jar包复制到该文件夹下
三、lib上右键---Build Path---add to Build Path 便可 java
全部方法位于FileUtils类中,均为静态方法,能够经过类名直接调用apache
/** * 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 包括 工具类 (utility classes
), 字节序列类 (endian classes
), 行迭代器 (line iterator
), 文件过滤器 (file filters
),文件比较器 (file comparators
) 和 流实现 (stream implementations
).编程
IOUtils 包含一些工具类,用于处理读,写和拷贝,这些方法基于 InputStream
, OutputStream
, Reader
和 Writer
工做.api
例如,思考一个任务,从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字符串对象app
FileUtils 包含一些工具类,它们基于File
对象工做,包括读,写,拷贝和比较文件工具
例如逐行读取整个文件你可使用:
File file = new File("/commons/io/project.properties"); List lines = FileUtils.readLines(file, "UTF-8");
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包含一些工具类,基于文件系统访问功能不被JDK支持。目前,只有一个方法就是获得驱动器空余空间。注意这使用命令行而不是 native code。
例如获得驱动器空余空间:
long freeSpace = FileSystemUtils.freeSpace("C:/");
不一样的计算机架构对应字节序采用不一样的约定,在所谓的”小端”架构(例如Intel),低位字节被存储在内存的最低字节,以后的字节在高地址。对于”大端”架构(如Motoroal),状况相反。
在这个包中有两个相关联的类:
DataInput
接口。能够从文件中读取非本地字节序。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); }
org.apache.commons.io.filefilter
包定义了一个接口 (IOFileFilter),同时继承了 java.io.FileFilter
和 java.io.FilenameFilter
接口。除此以外还提供了一系列可使用的IOFileFilter
接口实现,包括容许你组合其余过滤器。这些过滤器能够用来遍历文件或在FileDialog
中使用。
详情见 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
包中包含一些有用的流实现。他们包括:
本文档提供一些在IO领域的最佳实践
一般,你要处理文件和文件名。有不少地方可能出错:
这些都是不使用字符串类型文件名的充分理由。使用 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);
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 官方文档