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 官方文檔