Java路徑
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操作。
創建路徑(Path)對象
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();
現在p1AbsPath是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);
}
}
路徑URI
使用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