Path
物件表示檔案系統中檔案,目錄和符號連結的路徑。Path
是java.nio.file
包中的一個介面。
當建立一個Path物件時,路徑不一定存在。路徑可以使用舊的java.io.File
API。可以使用File
類的方法toPath()
從File
物件中獲取Path
物件。可以使用Path
物件的toFile()
方法從Path
物件中獲取File
物件。可以對Path
物件執行兩種操作:
可以使用Path
來存取路徑的元件,例如檔案名,根名等。
可以比較和檢查路徑。 例如,檢查路徑以.txt
結尾,比較兩個路徑是否相同,檢查路徑是絕對路徑還是相對路徑等。還可以組合和解析路徑。
需要使用Files
類在Path
物件上執行檔案I/O
操作。
FileSystem
物件充當工廠來建立Path
物件。FilePath
中的getPath()
方法建立一個Path
物件。
以下程式碼在Windows上為檔案路徑F:\website\yiibai\worksp\test1.txt
建立一個Path
物件:
Path p1 = FileSystems.getDefault().getPath("F:\\website\\yiibai\\worksp\\test1.txt");
可以在構造Path
物件時將路徑的元件單獨傳遞給getPath()
方法。以下語句建立一個Path
物件以表示Windows上的 F:\website\yiibai\worksp\test1.txt
路徑:
Path p2 = FileSystems.getDefault().getPath("F:", "website", "yiibai","worksp","test1.txt");
Paths
類可以從路徑字串或URI的元件建立一個Path
物件。Paths.get()
靜態方法建立一個Path
物件。
以下建立Path
物件以表示相同的路徑: F:\website\yiibai\worksp\test1.txt
:
Path p3 = Paths.get("F:\\website\\yiibai\\worksp\\test1.txt");
Path p4 = Paths.get("F:", "website", "yiibai","worksp","test1.txt");
我們可以從一個空路徑建立一個Path
物件,例如:Paths.get("")
。具有空路徑的Path
物件是指與當前工作目錄相同的預設目錄。
檔案系統中的路徑由一個或多個元件組成。getNameCount()
方法返回除了根之外的Path
物件中的元件數。
例如,路徑C:\Java_Dev\test1.txt
由三個元件組成:C:
的根,目錄名為Java_Dev
和test1.txt
檔案的兩個元件。 在這種情況下,getNameCount()
方法將返回2
。getName(int index)
方法返回指定索引處的元件名稱。最靠近根的元件的索引為0
。
離根最遠的元件的索引為count - 1
。在路徑:C:\Java_Dev\test1.txt
中,Java_Dev
元件的索引為0
,test1.txt
元件的索引為1
。getParent()
方法返回路徑的父級。 如果路徑沒有父級,則返回null
。
路徑 C:\Java_Dev\test.txt
的父目錄是 C:\Java_Dev
。相對路徑test.txt
沒有父級。
getRoot()
方法返回路徑的根。 如果路徑沒有根,它返回null
。
例如,Windows上的路徑C:\Java_Dev\test1.txt
,則 C:\
就是這個路徑的根。
getFileName()
方法返回由路徑表示的檔案名。如果路徑沒有檔案名,則返回null
。 檔案名是根的最遠元件。 例如,在路徑C:\Java_Dev\test1.txt
中,test1.txt
就是檔案名。
可以通過使用isAbsolute()
方法來檢查路徑是否代表絕對路徑。路徑不必存在以獲取有關其元件的資訊。
以下程式碼顯示了如何存取Path
物件的元件。
import java.nio.file.Path;
import java.nio.file.Paths;
public class Main {
public static void main(String[] args) {
Path p1 = Paths.get("F:\\website\\yiibai\\worksp\\test1.txt");
printDetails(p1);
Path p2 = Paths.get("test1.txt");
printDetails(p2);
}
public static void printDetails(Path p) {
System.out.println("Details for path: " + p);
int count = p.getNameCount();
System.out.println("Name count: " + count);
for (int i = 0; i < count; i++) {
Path name = p.getName(i);
System.out.println("Name at index " + i + " is " + name);
}
Path parent = p.getParent();
Path root = p.getRoot();
Path fileName = p.getFileName();
System.out.println("Parent: " + parent + ", Root: " + root + ", File Name: " + fileName);
System.out.println("Absolute Path: " + p.isAbsolute());
}
}
上面的程式碼生成以下結果。
Details for path: F:\website\yiibai\worksp\test1.txt
Name count: 4
Name at index 0 is website
Name at index 1 is yiibai
Name at index 2 is worksp
Name at index 3 is test1.txt
Parent: F:\website\yiibai\worksp, Root: F:\, File Name: test1.txt
Absolute Path: true
Details for path: test1.txt
Name count: 1
Name at index 0 is test1.txt
Parent: null, Root: null, File Name: test1.txt
Absolute Path: false
我們可以使用不同的型別來表示同一個路徑。 假設建立一個Path
物件,如下所示:
Path p1 = Paths.get("test.txt");
這裡,p1
是相對路徑。可以使用其toAbsolutePath()
方法獲得由p1
表示的絕對路徑,如下所示:
Path p1AbsPath = p1.toAbsolutePath();
現在p1AbsPat
h是p1
的絕對路徑。 例如,在Windows上,p1AbsPath
就類似路徑的全名C:\testapp\test.txt
。
如果路徑不是絕對路徑,toAbsolutePath()
方法使用預設目錄來解析路徑。
如果路徑是絕對路徑,toAbsolutePath()
方法返回相同的路徑。
我們可以使用toRealPath()
方法來獲取現有檔案的真實路徑。它返回一個現有檔案的規範路徑。如果路徑表示符號連結,則它返回目標檔案的實際路徑。
我們可以傳遞一個連結選項到這個方法,指示是否要跟蹤到它的目標的符號連結。如果路徑表示的檔案不存在,toRealPath()
會丟擲一個IOException
異常。
以下程式碼顯示了如何從Path
物件獲取實際路徑:
import java.nio.file.LinkOption;
import java.nio.file.Path;
import java.nio.file.Paths;
public class Main {
public static void main(String[] args) throws Exception {
Path p2 = Paths.get("test2.txt");
// Follow link for p2, if it is a symbolic link
Path p2RealPath = p2.toRealPath();
System.out.println("p2RealPath:" + p2RealPath);
Path p3 = Paths.get("test3.txt");
// Do not follow link for p3, if it is a symbolic link
Path p3RealPath = p3.toRealPath(LinkOption.NOFOLLOW_LINKS);
System.out.println("p3RealPath:" + p3RealPath);
}
}
使用Path
物件的toUri()
方法來獲取其URI
表示。以下程式碼顯示了如何獲取路徑的URI形式。
import java.nio.file.Path;
import java.nio.file.Paths;
public class Main {
public static void main(String[] args) throws Exception {
Path p2 = Paths.get("test2.txt");
java.net.URI p2UriPath = p2.toUri();
System.out.println("Absolute Path: " + p2.toAbsolutePath());
System.out.println("URI Path: " + p2UriPath);
}
}
上面的程式碼生成以下結果。
Absolute Path: F:\website\yiibai\worksp\test2.txt
URI Path: file:///F:/website/yiibai/worksp/test2.txt