Commons IO

Common IO 是一個工具庫,用來幫助開發IO功能 它包括6個主要部分html

  • Utility classes – 包括一些靜態方法來執行經常使用任務
  • Input – InputStream 和 Reader 實現
  • Output – OutputStream 和 Writer 實現
  • Filters – 多種文件過濾器實現(定義了 IOFileFilter接口,同時繼承了 FileFilter 和 FilenameFilter 接口)
  • Comparators – 用於文件比較的多種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 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 包含一些工具類,用於處理讀,寫和拷貝,這些方法基於 InputStreamOutputStreamReader 和 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

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 – 使用鎖文件提供寫入同步

詳情見 input 和 output 包的Javadoc。

最佳實踐


本文檔提供一些在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 官方文檔

相關文章
相關標籤/搜索