2014年4月5日 星期六

NIO.2 的檔案操作

前言

以往 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。另外 FilePath 不同之處在於 Path 可以提供 symbolic link 的功能。

PathFile 之間轉換,可以透過 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 官網

1 則留言: