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();
現在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);
}
}
路徑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