前言
以往 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 很像啊
回覆刪除