前言
以往 Java 要操作檔案時,總得自己去面對 XXStream、XXReader、XXWriter,一不小心就迷失在 class hierarchy 迷宮中而搞不清楚到底該怎麼寫才好 [淚目]。NIO.2 的出現,提供了簡單好用的 method 來解決這些困擾。
這篇都還在 Java 7 的範圍。已經出的 Java 8 也對 NIO.2 做了一些改善,中文資料可先參考 Ingram Chen blog 的 File operation 章節。
Path
在 NIO.2 中描述檔案的方式,不再使用 java.io.File,而改用 java.nio.file.Path。跟 File 比起來,Path 的行為比較接近字串或 URI 的概念,你沒辦法直接由 Path instance 去作一些操作(如 File.mkdir())或判斷(如 File.exists()),必須透過 Files。另外 File 與 Path 不同之處在於 Path 可以提供 symbolic link 的功能。
在 Path 與 File 之間轉換,可以透過 Path.toFile() 跟 File.toPath()。注意:File.getPath() 跟 Path 沒有關係。
Files
單純以使用的角度來看,NIO.2 的精華在於 java.nio.file.Files 這個 utility class,把很多行為都包的很簡單扼要,簡潔度跟在 command line 下指令差不多,幾乎直接條列出來就可以理解,不用多作解釋(謎之聲:所以你是來混文章數的 [指]):
- 複製檔案或目錄:
Files.copy(sourcePath, targetPath, copyOptions)- copyOptions 參閱
java.nio.file.StandardCopyOption
- copyOptions 參閱
- 刪除檔案或目錄:
Files.delete(path) - 移動檔案或目錄:
Files.move(sourcePath, targetPath, copyOptions) - 取得檔案大小:
Files.size(path),單位是 byte - 讀取檔案:
Files.readAllBytes(path)會回傳byte[],或是用Files.readAllLines(path, charset)會回傳List<String>,charset 參閱java.nio.charset.Charset。 - 寫入檔案:
Files.write(path, bytes, openOptions)或是Files.write(path, lines, charset, openOptions)。openOptions 參閱java.nio.file.StandardOpenOption。
搭配 File.toPath(),既有使用 File 的程式碼也幾乎能馬上轉換成使用 Files。
其他有趣的功能
- 用 glob 字串(例如
*.{java,class,jar})來指定過濾目錄下檔案的方式。過去得在File.list()時傳入FilenameFilter,現在則是用Files.newDirectorySteam(dirPath, globbingStr)。對於熟悉 glob 規則的人而言應該樂勝。 - 承上,用 glob 的方式找檔案。
- 監控目錄是否有改變。
- 判斷檔案的 MIME 型態。
完整的 NIO.2 教學可參見 Java 官網。
這幾個 utility 感覺和 commons-io 很像啊
回覆刪除