Path
對(duì)象表示文件系統(tǒng)中文件,目錄和符號(hào)鏈接的路徑。
Path
是java.nio.file包中的一個(gè)接口。
當(dāng)我們創(chuàng)建一個(gè)Path對(duì)象時(shí),路徑不一定存在。
Path
可以使用舊的java.io.File apI。我們可以使用File類的方法toPath()從File對(duì)象中獲取一個(gè)Path對(duì)象
我們可以使用Path對(duì)象的toFile()方法從Path對(duì)象中獲取File對(duì)象。
我們可以對(duì)Path對(duì)象執(zhí)行兩種操作:
我們可以使用 Path
來訪問路徑的組件,例如文件名,根名等。
我們可以比較和檢查路徑。例如,檢查路徑以.txt結(jié)尾,比較兩個(gè)路徑是否相同,檢查路徑是絕對(duì)路徑還是相對(duì)路徑等。我們還可以組合和解析路徑。
我們需要使用 Files
類在 Path
對(duì)象上執(zhí)行文件I/O操作。
FileSystem對(duì)象充當(dāng)工廠來創(chuàng)建Path對(duì)象
FilePath中的getPath()方法創(chuàng)建一個(gè)Path對(duì)象。
以下代碼在Windows上為文件路徑C:\Java_Dev\test1.txt創(chuàng)建一個(gè)Path對(duì)象:
Path p1 = FileSystems.getDefault().getPath("C:\\Java_Dev\\test1.txt");
我們可以在構(gòu)造Path對(duì)象時(shí)將路徑的組件單獨(dú)傳遞給getPath()方法。
以下語句創(chuàng)建一個(gè)Path對(duì)象以表示W(wǎng)indows上的C:\Java_Dev\test1.txt路徑:
Path p2 = FileSystems.getDefault().getPath("C:", "Java_Dev", "test1.txt");
Paths
類可以從路徑字符串或URI的組件創(chuàng)建 Path
對(duì)象。
Paths.get()
靜態(tài)方法創(chuàng)建一個(gè)Path對(duì)象。
以下創(chuàng)建 Path
對(duì)象來表示相同的路徑C:\Java_Dev\test1.txt:
Path p3 = Paths.get("C:\\Java_Dev\\test1.txt"); Path p4 = Paths.get("C:", "Java_Dev", "test1.txt");
我們可以從一個(gè)空路徑創(chuàng)建一個(gè) Path
對(duì)象,例如Paths.get(“")。具有空路徑的Path對(duì)象是指與當(dāng)前工作目錄相同的默認(rèn)目錄。
文件系統(tǒng)中的路徑由一個(gè)或多個(gè)組件組成。
getNameCount()方法返回除了根之外的Path對(duì)象中的組件數(shù)量。
例如,路徑C:\Java_Dev\test1.txt由三個(gè)組件組成:C:的根和名為Java_Dev和test1.txt的兩個(gè)組件。這種情況下,getNameCount()方法將返回2。
getName(int index)方法返回指定索引處的組件名稱。最靠近根的組件的索引為0。
離根最遠(yuǎn)的組件的索引為count - 1.在路徑中。
C:\Java_Dev\test1.txt,Java_Dev組件的索引為0,test1.txt組件的索引為1。
getParent()
方法返回路徑的父代。如果路徑?jīng)]有父級(jí),則返回null。
路徑C:\Java_Dev\test.txt的父目錄是C:\Java_Dev。
相對(duì)路徑test.txt沒有父級(jí)。
getRoot()方法返回路徑的根。如果路徑?jīng)]有根,它返回null。
例如,Windows上的路徑C:\Java_Dev\test1.txt具有C:\作為其根。
getFileName()方法返回由路徑表示的文件名。
如果路徑?jīng)]有文件名,則返回null。文件名是根的最遠(yuǎn)組件。例如,在路徑C:\Java_Dev\test1.txt中,test1.txt是文件名。
我們可以通過使用isAbsolute()方法來檢查路徑是否代表絕對(duì)路徑。
路徑不必存在以獲取有關(guān)其組件的信息。
以下代碼顯示了如何訪問Path對(duì)象的組件。
import java.nio.file.Path; import java.nio.file.Paths; public class Main { public static void main(String[] args) { Path p1 = Paths.get("C:\\Java_Dev\\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()); } }
上面的代碼生成以下結(jié)果。
我們可以得到一個(gè)路徑的不同類型的表示。假設(shè)我們創(chuàng)建一個(gè)Path對(duì)象,如下所示:
Path p1 = Paths.get("test.txt");
這里,p1是相對(duì)路徑。我們可以使用其toAbsolutePath()方法獲得由p1表示的絕對(duì)路徑,如下所示:
Path p1AbsPath = p1.toAbsolutePath();
現(xiàn)在p1AbsPath是p1的絕對(duì)路徑。例如,在Windows上,p1AbsPath可能看起來像C:\testapp\test.txt。
如果路徑不是絕對(duì)路徑,toAbsolutePath()方法使用默認(rèn)目錄來解析路徑。
如果路徑是絕對(duì)路徑,toAbsolutePath()方法返回相同的路徑。
我們可以使用toRealPath()方法來獲取現(xiàn)有文件的真實(shí)路徑。它返回到現(xiàn)有文件的規(guī)范路徑。如果路徑表示符號(hào)鏈接,則它返回目標(biāo)文件的實(shí)際路徑。
我們可以傳遞一個(gè)鏈接選項(xiàng)到這個(gè)方法,指示我們是否要跟蹤到它的目標(biāo)的符號(hào)鏈接。
如果路徑表示的文件不存在,toRealPath()會(huì)拋出一個(gè)IOException異常。
以下代碼顯示了如何從Path對(duì)象獲取實(shí)際路徑:
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); } }
上面的代碼生成以下結(jié)果。
更多建議: