作者:
PsMonkey (痞子軍團團長)
2014-04-05 23:35:24blog 版:http://blog.dontcareabout.us/2014/04/nio2.html
BBS 版以 markdown 語法撰寫
______________________________________________________________________
### 前言 ###
以往 Java 要操作檔案時,總得自己去面對 XXStream、XXReader、XXWriter,
一不小心就迷失在 class hierarchy 迷宮中
而搞不清楚到底該怎麼寫才好 [淚目]。
NIO.2 的出現,提供了簡單好用的 method 來解決這些困擾。
這篇都還在 Java 7 的範圍。
已經出的 Java 8 也對 NIO.2 做了一些改善,
中文資料可先參考 [Ingram Chen blog] 的 File operation 章節。
[Ingram Chen blog]: http://ingramchen.io/blog/2014/04/
java-8-new-api-tips.html
### 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`
* 刪除檔案或目錄:`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 官網][NIO.2]。
[NIO.2]: http://docs.oracle.com/javase/tutorial/essential/io/fileio.html
====
在 #1JEuXhuu 下的推文看到 Killercat 提到 BufferedReader,
再加上今天看到 Ingram 的那篇 blog,
所以乾脆整理一篇文章來介紹(x)混文章數(o)
不過這玩意真的好用、又是 JDK 內建,不用可惜阿 XD