1.Path

如果您想編寫一個程序來處理磁盤上的文件,那很容易。Java 有很多類可以幫助您處理文件本身及其內容。

Java 的早期版本使用File和之類的類FileInputStream來處理文件。但是,該類File現已棄用,不建議使用。當然,你可能仍然會在代碼、方法參數或類構造函數中遇到它。

從一開始,我們將開始學習如何使用該類處理文件PathPath是替換的類File。它更安全、更高效。

Path班級

從技術上講,Path它不是一個類——它是一個接口。Path這樣做是為了允許為每個操作系統(和文件系統)編寫類的後代。

Windows 有一個寫入文件路徑的標準,而 Linux 有另一個。當然,世界上還有很多其他的操作系統,每個都有自己的標準。

這就是為什麼Path在處理文件的方法中到處都使用接口的原因,儘管實際上工作是通過其後代類進行的:WindowsPath, UnixPath, ...

創建Path對象

要創建一個Path對象(實際上是子類的對象WindowsPath),您需要使用如下語句:

Path name = Path.of(path);

其中name是變量的名稱Pathpath是文件(或目錄)的路徑,包括文件(或目錄)的名稱。並且of是類的靜態方法Path

如果程序在 Windows 上運行,則該of()方法用於創建對象。WindowsPath如果程序在 Linux 上運行,則UnixPath創建對象。您不能使用Path像.new Path()

例子:

代碼 筆記
Path file = Path.of("c:\\projects\\note.txt");
文件路徑
Path directory = Path.of("c:\\projects\\");
目錄路徑

文件(或目錄)不需要存在才能使有效Path對象存在。也許你只是想創建一個文件......一個Path對象就像一個加強版String:它沒有綁定到磁盤上的特定文件——它只是在磁盤上存儲一個特定的路徑。就是這樣。


Path2.類型的方法

Path接口有很多有趣的方法。下表列出了最有趣的一些。

方法 描述
Path getParent()
返回父目錄
Path getFileName()
返回沒有目錄的文件名
Path getRoot()
從路徑返回根目錄
boolean isAbsolute()
檢查當前路徑是否是絕對路徑
Path toAbsolutePath()
將路徑轉換為絕對路徑
Path normalize()
刪除目錄名稱中的通配符。
Path resolve(Path other)
從絕對路徑和相對路徑構造一個新的絕對路徑。
Path relativize(Path other)
從兩個絕對路徑中獲取一個相對路徑。
boolean startsWith(Path other)
檢查當前路徑是否以給定路徑開頭
boolean endsWith(Path other)
檢查當前路徑是否以給定路徑結束
int getNameCount()
/使用作為分隔符將路徑拆分為多個部分。
返回零件數。
Path getName(int index)
/使用作為分隔符將路徑拆分為多個部分。
按其索引返回一個部分。
Path subpath(int beginIndex, int endIndex)
/使用作為分隔符將路徑拆分為多個部分。
返回對應於給定間隔的子路徑。
File toFile()
將對象轉換Path為已棄用的File對象
URI toUri()
將對象轉換PathURI對象

以下是對現有方法的簡要說明。


3.將路徑分成幾部分

getParent()方法返回指向當前路徑的父目錄的路徑。不管這個路徑是目錄還是文件:

代碼 價值
String str = "c:\\windows\\projects\\note.txt";
Path path = Path.of(str).getParent();
"c:\\windows\\projects\\"
String str = "c:\\windows\\projects\\";
Path path = Path.of(str).getParent();
"c:\\windows\\"
String str = "c:\\";
Path path = Path.of(str).getParent();
null

getFileName()方法返回單個文件(或目錄)名稱——無論最後一個定界符之後是什麼:

代碼 價值
String str = "c:\\windows\\projects\\note.txt";
Path path = Path.of(str).getFileName();
"note.txt"
String str = "c:\\windows\\projects\\";
Path path = Path.of(str).getFileName();
"projects"
String str = "c:\\";
Path path = Path.of(str).getFileName();
null

getRoot()方法返回根目錄的路徑:

代碼 價值
String str = "c:\\windows\\projects\\";
Path path = Path.of(str).getRoot();
"c:\\"


4.絕對路徑和相對路徑

有兩種類型的路徑:絕對路徑和相對路徑。絕對路徑從根目錄開始。對於 Windows,這可能是c:\文件夾;對於 Linux —/目錄

相對路徑相對於某個目錄是有意義的。也就是說,它就像路的盡頭,但沒有開始。您可以將相對路徑轉換為絕對路徑,反之亦然

boolean isAbsolute()方法

該方法檢查當前路徑是否是絕對路徑

代碼 價值
String str = "c:\\windows\\projects\\note.txt";
boolean abs = Path.of(str).isAbsolute();
true
String str = "src\\com\\codegym\\Main.java";
boolean abs = Path.of(str).isAbsolute();
false

Path toAbsolutePath()方法

將路徑轉換為絕對路徑。如有必要,將當前工作目錄添加到其中:

代碼 價值
String str = "c:\\windows\\projects\\note.txt";
Path path = Path.of(str).toAbsolutePath();
"c:\\windows\\projects\\note.txt"
String str = "src\\com\\codegym\\Main.java";
Path path = Path.of(str).toAbsolutePath();
"d:\\work\\src\\com\\codegym\\Main.java"

Path normalize()方法

在路徑中,可以不用目錄名,而寫“..”,意思是返回一個目錄。規範化消除了這些東西。例子:

代碼 價值
String str = "c:\\windows\\..\\projects\\note.txt";
Path path = Path.of(str).normalize();
"c:\\projects\\note.txt"
String str = "src\\com\\codegym\\..\\Main.java";
Path path = Path.of(str).normalize();
"src\\com\\Main.java"

Path relativize(Path other)方法

relativize()方法允許您構建“路徑之間的差異”:一條路徑相對於另一條路徑

代碼 價值
Path path1 = Path.of("c:\\windows\\projects\\note.txt");
Path path2 = Path.of("c:\\windows\\");
Path result = path2.relativize(path1);
"projects\\note.txt"
Path path1 = Path.of("c:\\windows\\projects\\note.txt");
Path path2 = Path.of("c:\\windows\\");
Path result = path1.relativize(path2);
"..\\.."
Path path1 = Path.of("c:\\aaa\\bbb\\1.txt");
Path path2 = Path.of("d:\\zzz\\y.jpg");
Path result = path1.relativize(path2);
非法參數異常:
這兩條路徑有不同的“根”(不同的磁盤)

Path resolve(Path other)方法

resolve()方法的作用與 相反relativize():它從絕對路徑和相對路徑構建新的絕對路徑。

代碼 價值
Path path1 = Path.of("projects\\note.txt");
Path path2 = Path.of("c:\\windows\\");
Path result = path1.resolve(path2);
"c:\\windows"
Path path1 = Path.of("projects\\note.txt");
Path path2 = Path.of("c:\\windows\\");
Path result = path2.resolve(path1);
"c:\\windows\\projects\\note.txt"

toFile()方法

該方法返回一個已棄用的File對象,該對象存儲與該對象相同的文件路徑Path

toURI()方法

該方法將路徑轉換為標準URI,並返回一個包含文件路徑的對象:

文件路徑 文件的 URI
c:\windows\projects\note.txt
file:///c:/windows/projects/note.txt