1. 程式人生 > 其它 >【Java學習筆記(一百一十八)】之 Path類和Files類處理檔案系統

【Java學習筆記(一百一十八)】之 Path類和Files類處理檔案系統

技術標籤:Java學習筆記# JavaEEjava

本文章由公號【開發小鴿】釋出!歡迎關注!!!


老規矩–妹妹鎮樓:

一. 處理檔案系統

(一) 概述

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方法通常用於延遲操作,如刪除目錄樹時,需要在移除當前目錄中的所有檔案之後,才能夠移除該目錄。