Java Path是在JDK 1.6和JDK1.7中推出的。在JDK 1.7之後正式加入到NIO中。Path介面在java.nio.file包下,Path的完整路徑名為java.nio.file.Path。
Java Path例項代表檔案系統中的路徑。Path可以指向任何檔案或路徑。Path可以是絕對路徑,也可以是相對路徑。絕對路徑包含從檔案系統根路徑開始的完整路徑。相對路徑是檔案或目錄相對於其他檔案的路徑。相對路徑聽起來有點迷惑。不要擔心,我會在Java NIO Path教程中進行詳細地介紹。
不要將一些作業系統的path環境變數與檔案系統的路徑混淆。java.nio.file.Path介面與path環境變數一點關係也沒有。
在許多種情況下,Java.nio.file.Path與java.io.path有點相像,但是它們之間也有一點的區別。儘管在許多情況下File類可以直接替換成Path。
建立Path例項
為了使用java.nio.file.Path例項,必須先建立一個Path例項。建立Path例項可以通過Path的靜態方法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");
}
}
複製程式碼
注意到例子中的兩個import例子。為了使用Path介面和Paths類,我們必須先匯入它。
其次,注意到Paths.get("c:\data\myfile.txt")方法呼叫。它是呼叫Paths.get()方法來建立Path例項。換句話說,Path.get()方法是一個工廠方法來建立Path例項。
建立絕對Path
建立絕對Path是通過工廠方法Paths.pget()方法,方法的引數是檔案的絕對路徑。下面是一個建立絕對Path的例子:
Path path = Paths.get("c:\\data\\myfile.txt");
複製程式碼
絕對Path是==c:\data\myfile.txt.==。在Java中兩上\是必須的,因為\是一個轉義符號,它代表後面的字元按實際顯示,不需要轉義。寫入兩個\會告訴Java編譯器在字串中寫入一個\。
以上的路徑是Window的檔案系統路徑。在Unix系統中,以上的路徑可以像這樣:
Path path = Paths.get("/home/jakobjenkov/myfile.txt");
複製程式碼
現在的絕對路徑是== /home/jakobjenkov/myfile.tx==
如果你在Windows系統中使用這種路徑,路徑為替換為相對當前驅動器來說。例如,路徑
/home/jakobjenkov/myfile.txt
複製程式碼
可以被解析在C盤上。然後,路徑的完整路徑將會是
C:/home/jakobjenkov/myfile.txt
複製程式碼
建立相對Path
相對路徑是一個Path相對於另一個檔案或目錄的路徑。完整的Path是基Path加上相對Path。
Java NIO中的Path類也可以工作在相對路徑中。可以通過Paths.get(basePath,relativePath)方法來建立相對路徑。下面是兩個相對路徑的例子:
Path projects = Paths.get("d:\\data", "projects");
Path file = Paths.get("d:\\data", "projects\\a-project\\myfile.txt");
複製程式碼
第一個例子建立了一個指向d:\data\project目錄的Path。第二個例子建立了一個指向d:\data\projects\a-project\myfile.txt檔案的Path。
在使用相對Path時有兩種特殊的Code在路徑中使用。這些Code為:
- .
- ..
code .表示當前目錄。例如,如果你建立了像這樣的相對路徑,像這樣:
Path currentDir = Paths.get(".");
System.out.println(currentDir.toAbsolutePath());
複製程式碼
Path會指向當前執行程式碼的目錄。
如果.出現在路徑字串的中間,它僅僅代表與當前目錄相同的位置。Path例子如下:
Path currentDir = Paths.get("d:\\data\\projects\.\a-project");
複製程式碼
最終路徑為
This path will correspond to the path:
複製程式碼
..代表父目錄或上一級目錄。下面是Path的例子:
Path parent = Paths.get("..");
複製程式碼
這個方法返回的父目錄是當前應用程式執行的目錄的父目錄。
如果..出現在路徑字串的中間,它代表當前字串的上一級目錄,例如:
String path = "d:\\data\\projects\\a-project\\..\\another-project";
Path parentDir2 = Paths.get(path);
複製程式碼
以上例子指向的絕對路徑為
d:\data\projects\another-project
複製程式碼
a-projcet後面的..會將當前目錄指向上一級目錄,並將目錄向下指向到another-project目錄。
.和..可以在兩個引數Paths.get()方法中使用,如下所示:
Path path1 = Paths.get("d:\\data\\projects", ".\\a-project");
Path path2 = Paths.get("d:\\data\\projects\\a-project",
"..\\another-project");
複製程式碼
Java NIO中還有許多方式來處理相對Path。這將會在教程中後續部分進行介紹。
Path.normalize()
normalize()方法可以將路徑標準化。標準化意味著將路徑中的.和..都移除掉,並解析當前路徑字串所指向的路徑。下面是Java Path.normalize()方法的例子:
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);
複製程式碼
Path例子首先建立了一個在路徑中包含..的路徑字串。然後用這個字串建立了一個路徑,並列印出了路徑。
例子中呼叫了normalize()方法建立了Path例項,它返回了一個新的路徑例項。這個新的,標準化的路徑例項也被輸出了。
下面是以上例子的輸出結果:
path1 = d:\data\projects\a-project\..\another-project
path2 = d:\data\projects\another-project
複製程式碼
正如你所看到的,標準化的路徑中並不包含==a-project..==。因為它是冗餘的。刪除的部分不會在最終的絕對路徑中新增任何東西。