Java的path接口是作為Java NIO 2的一部分是Java6,7中NIO的升級增加部分。Path在Java 7新增的。相關(guān)接口位于java.nio.file包下,所以Javaz內(nèi)Path接口的完整名稱是java.nio.file.Path.
一個Path實例代表一個文件系統(tǒng)內(nèi)的路徑。path可以指向文件也可以指向目錄。可以使相對路徑也可以是絕對路徑。絕對路徑包含了從根目錄到該文件(目錄)的完整路徑。相對路徑包含該文件(目錄)相對于其他路徑的路徑。相對路徑聽起來可能有點讓人頭暈。但是別急,稍后我們會詳細(xì)介紹。
不要把文件系統(tǒng)中路徑和環(huán)境變量的路徑混淆。java.nio.file.Path和環(huán)境變量沒有任何關(guān)系。
在很多情況下java.no.file.Path接口和java.io.File比較相似,但是他們之間存在一些細(xì)微的差異。盡管如此,在大多數(shù)情況下,我們都可以用File相關(guān)類來替換Path接口。
為了使用java.nio.file.Path實例我們必須創(chuàng)建Path對象。創(chuàng)建Path實例可以通過Paths的工廠方法get()。下面是一個實例:
import java.nio.file.Path;
import java.nio.file.Paths;
public classs PathExample {
public static void mian(String[] args) {
Path = path = Paths.get("c:\\data\\myfile.txt");
}
}
注意上面的兩個import聲明。需要使用Path和Paths的接口,畢現(xiàn)先把他們引入。
其次注意Paths.get("c:\data\myfile.txt")的調(diào)用。這個方法會創(chuàng)建一個Path實例,換句話說Paths.get()是Paths的一個工廠方法。
創(chuàng)建絕對路徑只需要調(diào)動Paths.get()這個工廠方法,同時傳入絕對文件。這是一個例子:
Path path = Paths.get("c:\\data\\myfile.txt");
對路徑是c:\data\myfile.txt,里面的雙斜杠\字符是Java 字符串中必須的,因為\是轉(zhuǎn)義字符,表示后面跟的字符在字符串中的真實含義。雙斜杠\表示\自身。
上面的路徑是Windows下的文件系統(tǒng)路徑表示。在Unixx系統(tǒng)中(Linux, MacOS,FreeBSD等)上述的絕對路徑長得是這樣的:
Path path = Paths.get("/home/jakobjenkov/myfile.txt");
他的絕對路徑是/home/jakobjenkov/myfile.txt。 如果在Windows機(jī)器上使用用這種路徑,那么這個路徑會被認(rèn)為是相對于當(dāng)前磁盤的。例如:
/home/jakobjenkov/myfile.txt
這個路徑會被理解其C盤上的文件,所以路徑又變成了
C:/home/jakobjenkov/myfile.txt
相對路徑是從一個路徑(基準(zhǔn)路徑)指向另一個目錄或文件的路徑。完整路徑實際上等同于相對路徑加上基準(zhǔn)路徑。
Java NIO的Path類可以用于相對路徑。創(chuàng)建一個相對路徑可以通過調(diào)用Path.get(basePath, relativePath),下面是一個示例:
Path projects = Paths.get("d:\\data", "projects");
Path file = Paths.get("d:\\data", "projects\\a-project\\myfile.txt");
第一行創(chuàng)建了一個指向d:\data\projects的Path實例。第二行創(chuàng)建了一個指向d:\data\projects\a-project\myfile.txt的Path實例。 在使用相對路徑的時候有兩個特殊的符號:
.表示的是當(dāng)前目錄,例如我們可以這樣創(chuàng)建一個相對路徑:
Path currentDir = Paths.get(".");
System.out.println(currentDir.toAbsolutePath());
currentDir的實際路徑就是當(dāng)前代碼執(zhí)行的目錄。 如果在路徑中間使用了.那么他的含義實際上就是目錄位置自身,例如:
Path currentDir = Paths.get("d:\\data\\projects\.\a-project");
上訴路徑等同于:
d:\data\projects\a-project
..表示父目錄或者說是上一級目錄:
Path parentDir = Paths.get("..");
這個Path實例指向的目錄是當(dāng)前程序代碼的父目錄。 如果在路徑中間使用..那么會相應(yīng)的改變指定的位置:
String path = "d:\\data\\projects\\a-project\\..\\another-project";
Path parentDir2 = Paths.get(path);
這個路徑等同于:
d:\data\projects\another-project
.和..也可以結(jié)合起來用,這里不過多介紹。
Path的normalize()方法可以把路徑規(guī)范化。也就是把.和..都等價去除:
String originalPath = "d:\\data\\projects\\a-project\\..\\another-project";
Path path1 = Paths.get(originalPath);
System.out.println("path1 = " + path1);
Path path2 = path1.normalize();
System.out.println("path2 = " + path2);
這段代碼的輸出如下:
path1 = d:\data\projects\a-project\..\another-project
path2 = d:\data\projects\another-project