《Java NIO教程》Java NIO Path
原文連結 作者:Jakob Jenkov 譯者:黃國鵬
Java的Path介面是Java NIO2 的一部分,是對Java6 和Java7的 NIO的更新。Java的Path介面在Java7 中被新增到Java NIO,位於java.nio.file包中, 其全路徑是java.nio.file.Path。
一個Path例項代表了一個檔案系統中的路徑。一個路徑可以指向一個檔案或者一個資料夾。一個路徑可以是絕對路徑或者是相對路徑。絕對路徑是從根路徑開始的全路徑,相對路徑是一個相對其他路徑的檔案或資料夾路徑。相對路徑可能會造成一點混亂,但是不要擔心,在本文章中,我會詳細解釋相對路徑的。
不要混淆了檔案系統中的路徑 和 作業系統中環境變數的path路徑。java.nio.file.Path例項與環境變數中的path沒有任何關係。
在很多地方java.nio.file.Path介面和java.io.File類是相似的,但是它們有幾個主要的不同。 在很多類中,你可以使用Path 介面替換 file 類使用。
建立一個Path例項
要想使用 一個 Path例項,你必須要先建立一個Path例項,可以使用Paths類 (java.nio.file.Paths)中的靜態方法 Path.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”)方法的呼叫,這個方法是建立一個Path例項。 換句話說,Paths.get() 方法是一個建立Path例項的工廠方法。
建立一個絕對路徑
以絕對路徑檔案作為引數呼叫Paths.get()工廠方法後就是建立一個絕對Path例項,例子如下
Path path = Paths.get("c:\\data\\myfile.txt");
c:\data\myfile.txt就是絕對路徑,由於java中一個 \ 是轉義字元,所以要寫成兩個 \ ,\就是告訴java編譯器變成一個 \ 放到字串中。
上面的是Windows作業系統中寫法,在Unix作業系統中(Linux, MacOS, FreeBSD 等等),上面路徑類似寫成:
Path path = Paths.get("/home/jakobjenkov/myfile.txt");
現在絕對路徑是 /home/jakobjenkov/myfile.txt
如果你在windows系統中使用 以 / 開頭的路徑,那麼就會被理解為相對於當前驅動器,
/home/jakobjenkov/myfile.txt
會從C盤根目錄開始解析,最終的全路徑就是:
C:/home/jakobjenkov/myfile.txt
##建立一個相對路徑
相對路徑是指以一個路徑(基本路徑)指向 一個檔案或者資料夾的路徑,它的絕對路徑會結合基本路徑推算 出來。
Java NIO Paths類也可以用來建立相對路徑的例項。你可以是使用Paths.get(basePath, relativePath)方法建立一個相對路徑的例項。
Path projects = Paths.get("d:\\data", "projects");
Path file = Paths.get("d:\\data", "projects\\a-project\\myfile.txt");
第一行程式碼是建立一個指向 d:\data\projects 資料夾路徑的 例項,第二行程式碼是建立一個 指向d:\data\projects\a-project\myfile.txt檔案路徑的例項。
當使用相對路徑使用,有兩個特別的符號可以被包含在路徑的字串中,符號如下:
- .
- ..
“.” 代表當前目錄,如果你建立一個相對Path例項:
Path currentDir = Paths.get(".");
System.out.println(currentDir.toAbsolutePath());
上面例子中Path例項的絕對路徑就是該程式碼執行時的目錄的絕對路徑。
如果 . 在 路徑字串的中間位置,就是指向同一個目錄(譯者注:就相當於不加 . 一樣),例子:
Path currentDir = Paths.get("d:\\data\\projects\.\a-project");
上面路徑就是和下面路徑一致
d:\data\projects\a-project
.. 代表父目錄或者是上一級目錄,示例:
Path parentDir = Paths.get("..");
上面例子中Path例項的絕對路徑就是該程式碼執行時的父目錄的絕對路徑。
如果 .. 在路徑字串的中間位置,相當於指向了上一級目錄,例子:
String path = "d:\\data\\projects\\a-project\\..\\another-project";
Path parentDir2 = Paths.get(path);
上面路徑和下面路徑一致
d:\data\projects\another-project
a-project後面的 .. 改變了目錄指向上一級父目錄 project ,然後再參照 父目錄project,指向下一級目錄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()可以標準化一個路徑。標準化意思是解析路徑中的. 和 .. 。例子如下:
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例項,使用路徑字串建立例項後,並把Path例項打印出來(也就是呼叫Path.toString()方法)。
呼叫建立的Path例項後,返回一個新的Path例項,這個新的,標準的Path例項最後也打印出來。
上面程式碼列印的內容如下:
path1 = d:\data\projects\a-project\..\another-project
path2 = d:\data\projects\another-project
我們可以看到規範化的路徑沒有包含a-project..多餘的部分,移除的部分對於絕對路徑是無關緊要的。