Java Path接口是Java NIO2一部分,是對(duì)Java6 和Java7的更新惩阶。Java的Path接口在Java7中被添加到Java NIO中,位于java.nio.file包中扣汪,全路徑名為是java.nio.file.Path断楷。
Java Path接口代表文件系統(tǒng)中的一個(gè)路徑。路徑指向一個(gè)文件或者目錄崭别。路徑可以使絕對(duì)的或相對(duì)的冬筒。絕對(duì)路徑包含了從根目錄開始,到指向文件或目錄的全部路徑茅主,相對(duì)路徑包含文件或目錄相對(duì)于其他路徑的路徑舞痰。相對(duì)路徑聽起來有點(diǎn)復(fù)雜,別擔(dān)心诀姚,在Java NIO Path教程中會(huì)對(duì)相對(duì)路徑進(jìn)行詳細(xì)解釋响牛。
不要混淆了文件系統(tǒng)中的路徑和操作系統(tǒng)中環(huán)境變量的Path路徑。java.nio.file.Path實(shí)例和環(huán)境變量中的Path沒有任何關(guān)系赫段。
很多地方j(luò)ava.nio.file.Path接口和java.io.File類是類似的呀打,但是有一些不同。在很多情況下糯笙,能用Path接口代替File類贬丛。
創(chuàng)建一個(gè)Path實(shí)例
為了使用Java.nio.file.Path實(shí)例,需要?jiǎng)?chuàng)建Path實(shí)例给涕。用Paths類(java.nio.file.Paths)中的名為Path.get()的靜態(tài)方法創(chuàng)建Path實(shí)例豺憔。下面是一個(gè)Java Paths.get()的例子:
import java.nio.file.Path;
import java.nio.file.Paths;
public class PathExample {
public static void main(String[] args) {
Path path = Paths.get("c:\\data\\myfile.txt");
}
}
注意例子頂端的兩個(gè)import聲明额获。使用Path接口和Paths類需要先引入他們。
然后恭应,注意Paths.get("c:\data\myfile.txt")的調(diào)用抄邀。對(duì)Path.get()的調(diào)用創(chuàng)建了Path實(shí)例。換句話說昼榛,Paths.get()方法是Path實(shí)例的工廠方法境肾。
創(chuàng)建一個(gè)絕對(duì)路徑
創(chuàng)建絕對(duì)路徑用Paths.get()工廠方法以絕對(duì)文件作為參數(shù)來實(shí)現(xiàn)。下面是一個(gè)創(chuàng)建表示絕對(duì)路徑的Path實(shí)例的例子:
Path path = Paths.get("c:\\data\\myfile.txt");
絕對(duì)路徑是c:\data\myfile.txt褒纲,兩個(gè)\字符是因?yàn)樵贘ava中\(zhòng)是跳轉(zhuǎn)字符,用來表示接下來的字符钥飞。莺掠。。读宙。(感覺這里原文說的不對(duì)彻秆。就是轉(zhuǎn)義字符的意思嘛。)寫\就是告訴Java編譯器往字符串中寫入一個(gè)\结闸。
上面的路徑是Windows操作系統(tǒng)中的系統(tǒng)路徑唇兑,在Unix系統(tǒng)(Linux,MacOS等)中桦锄。上面的絕對(duì)路徑看起來像下面這這樣:
Path path = Paths.get("/home/jakobjenkov/myfile.txt");
上面表示的路徑是:/home/jakobjenkov/myfile.txt .
如果是在Windoes機(jī)器中使用這種路徑(用/開始一個(gè)路徑)路徑將會(huì)作為相對(duì)于當(dāng)前驅(qū)動(dòng)盤來解析扎附。
例如,這個(gè)路徑
/home/jakobjenkov/myfile.txt
如果放在C盤里结耀,路徑就被解釋為:
C:/home/jakobjenkov/myfile.txt
創(chuàng)建一個(gè)相對(duì)路徑
相對(duì)路徑是指向相對(duì)于一個(gè)文件或者目錄的路徑留夜。相對(duì)路徑的全路徑(絕對(duì)路徑)通過結(jié)合基礎(chǔ)路徑和相對(duì)路徑來獲得。
Java NIO 的Path類也能使用相對(duì)路徑图甜。用Path.get(basePath,relativePath)方法創(chuàng)建一個(gè)相對(duì)路徑碍粥。下面是兩個(gè)例子:
Path projects = Paths.get("d:\\data", "projects");
Path file = Paths.get("d:\\data", "projects\\a-project\\myfile.txt");
第一個(gè)例子創(chuàng)建了一個(gè)Java Path實(shí)例指向d:\data\projects目錄。
第二個(gè)例子創(chuàng)建了一個(gè)Java Path實(shí)例指向d:\data\projects\a-project\myfile.txt文件黑毅。
使用相對(duì)路徑的時(shí)候嚼摩,可以用兩個(gè)特殊的字符:
- .:當(dāng)前目錄
- ..:父目錄或上級(jí)目錄
例如,如果用如下代碼創(chuàng)建相對(duì)路徑:
Path currentDir = Paths.get(".");
System.out.println(currentDir.toAbsolutePath());
這樣這樣Path對(duì)象代表的絕對(duì)路徑相當(dāng)于這個(gè)應(yīng)用執(zhí)行的代碼所在的目錄矿瘦。
如果.
在路徑中使用枕面,表示這個(gè)點(diǎn)指向的路徑,例如:
Path currentDir = Paths.get("d:\\data\\projects\.\a-project");
相當(dāng)于:
d:\data\projects\a-project
..
的例子:
Path parentDir = Paths.get("..");
這個(gè)例子創(chuàng)建的Path相當(dāng)于這個(gè)應(yīng)用的代碼所在的目錄的上一級(jí)目錄缚去。
如果在路徑中使用..
相當(dāng)于路徑指向的目錄的上一級(jí)膊畴。例如:
String path = "d:\\data\\projects\\a-project\\..\\another-project";
Path parentDir2 = Paths.get(path);
相當(dāng)于絕對(duì)路徑:
d:\data\projects\another-project
a-project目錄后面的..
將目錄提升到父目錄projects,然后路徑重新指到另一個(gè)another-project病游。
.和.. 都可以再唉Paths.get()的雙形參方法中使用:
Path path1 = Paths.get("d:\\data\\projects", ".\\a-project");
Path path2 = Paths.get("d:\\data\\projects\\a-project",
"..\\another-project");
Path.normalize()
Path的normalize()方法可以標(biāo)準(zhǔn)化路徑唇跨。也就是說能將.和..都去掉稠通,指向真正的路徑目錄地址:
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);
輸出結(jié)果為:
path1 = d:\data\projects\a-project\..\another-project
path2 = d:\data\projects\another-project