【Java學習筆記(一百一十八)】之 Path類和Files類處理檔案系統
本文章由公號【開發小鴿】釋出!歡迎關注!!!
老規矩–妹妹鎮樓:
一. 處理檔案系統
(一) 概述
Path和Files類封裝了在機器上處理檔案系統所需的所有功能。
(二) Path
Path表示的是一個目錄名序列,其後可以跟著一個檔名,路徑的第一部分可以是根路徑,如“/”,以根路徑起始的是絕對路徑,否則就是相對路徑。靜態的Path.get方法接受多個字串,用預設檔案系統的路徑分隔符連線起來,返回一個Path物件,如下所示:
Path absolute = Paths.get(“/home”, “harry”);
Path物件對應的並一定是一個存在的檔案,僅僅是一個抽象的名字序列,在建立檔案時,首先要建立一個路徑。要解析路徑,使用resolve()方法返回一個路徑,對於p.resolve(q),如果q是絕對路徑則返回q;否則,將返回新的路徑為p後面跟著q。
(三) Files
1、 讀寫檔案
Files類能夠快速地讀取檔案的內容,如
讀取所有位元組:
byte[] bytes = Files.readAllBytes(path);
讀取所有文字:
var content = Files.readString(path, charset);
對於讀取中等長度的文字檔案,可以使用Files類,對於大檔案還是使用IO流和讀入寫出器。
2. 建立檔案和目錄
建立新目錄:
Files.createDirectory(path);
建立空檔案:
Files.createFile(path);
在建立時可以指定屬性,如擁有者,許可權等等。
3. 複製,移動,刪除檔案
複製檔案:
Files.copy(fromPath, toPath);
移動檔案:
Files.move(fromPath, toPath);
同樣的,可以新增選項,如覆蓋已有的目標路徑StandardCopyOption.REPLACE_EXISTING
,複製所有的檔案屬性StandartCopyOption.COPY_ATTRIBUTES
。
4. 訪問目錄中的項
靜態的Files.list方法返回一個可以讀取目錄中各個項的Stream<Path>
物件,目錄是被惰性讀取的,這是十分高效的,由於讀取目錄涉及到需要關閉的系統資源,因此使用try塊:
try(Stream<Path> entries = Files.list(pathToDirectory)){}
list方法不會進入子目錄,要處理子目錄,使用Files.walk方法。而對於更加細粒度的遍歷目錄,應該使用Files.newDirectoryStream物件,產生一個DirectoryStream,注意,這不是Stream的子介面,而是專門用於目錄遍歷的介面,是Iterable的子介面,可以在增強for迴圈中使用目錄流,如下所示:
try(DirectoryStream<Path> entries = Files.newDirectoryStream(str)){}
如果想要訪問某個目錄的所有子孫成員,可以呼叫walkFileTree方法, 傳入一個FileVisitor型別的物件,便捷類SimpleFileVisitor實現了FileVisitor介面,這個物件有以下的通知:
訪問檔案或目錄時: FileVisitResult visitFile(…);
在目錄被處理前: FileVisitResult preVisitDirectory(…);
在目錄被處理後: FileVisitResult postVisitDirectory(…);
FileVisitResult物件指的是操作的返回結果,是繼續訪問下一個檔案:FileVisitResult.CONTINUE
等等
walkFileTree方法通常用於延遲操作,如刪除目錄樹時,需要在移除當前目錄中的所有檔案之後,才能夠移除該目錄。