NIO.2 的檔案操作

看板java作者 (痞子軍團團長)時間11年前 (2014/04/05 23:35), 編輯推噓2(201)
留言3則, 3人參與, 最新討論串1/1
blog 版: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 -- 錢鍾書: 說出來的話 http://www.psmonkey.org 比不上不說出來的話 Java 版 cookcomic 版 只影射著說不出來的話 and more...... -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 114.37.95.152 ※ 文章網址: http://www.ptt.cc/bbs/java/M.1396712127.A.A1C.html

04/05 23:47, , 1F
這個算JDK8的亮點(雖然7就有) 不過8我最看好stream XD
04/05 23:47, 1F

04/06 19:51, , 2F
感謝整理
04/06 19:51, 2F

04/09 00:41, , 3F
04/09 00:41, 3F
文章代碼(AID): #1JG2A_eS (java)
文章代碼(AID): #1JG2A_eS (java)