Java NIO系列教程(十 五)Java NIO Path
原文連結 譯者:章筱虎
Path介面是java NIO2的一部分。首次在java 7中引入。Path介面在java.nio.file包下,所以全稱是java.nio.file.Path。 java中的Path表示檔案系統的路徑。可以指向檔案或資料夾。也有相對路徑和絕對路徑之分。絕對路徑表示從檔案系統的根路徑到檔案或是資料夾的路徑。相對路徑表示從特定路徑下訪問指定檔案或資料夾的路徑。相對路徑的概念可能有點迷糊。不用擔心,我將在本文的後面詳細介紹相關細節。
不要將檔案系統的path和作業系統的環境變數path搞混淆。java.nio.file.Path介面和作業系統的path環境變數沒有任何關係。
在很多方面,java.nio.file.Path介面和java.io.File有相似性,但也有一些細微的差別。在很多情況下,可以用Path來代替File類。
建立Path例項
為了使用java.nio.file.Path例項,必須首先建立它。可以使用Paths 類的靜態方法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語句。想要使用Paths類和Path介面,必須首先引入相應包。其次,注意Paths.get(“c:\\data\\myfile.txt”)的用法。其使用了Paths.get方法建立了Path的例項。它是一個工廠方法。
建立絕對路徑Path
呼叫傳入絕對路徑當做引數的Paths.get()工廠方法,就可以生成絕對路徑Path。示例如下:
Path path = Paths.get("c:\\data\\myfile.txt");
示例中的絕對路徑是c:\data\myfile.txt。有兩個\字元的原因是第一個\是轉義字元,表示緊跟著它的字元需要被轉義。\\表示需要向字串中寫入一個\字元。
上文示例的path是windows下的路徑。在Unix系統(Linux,MacOS,FreeBSD等)中,上文中的path是這樣的:
Path path = Paths.get("/home/jakobjenkov/myfile.txt");
/home/jakobjenkov/myfile.txt就稱作絕對路徑。
如果把以/開頭path的格式執行在windows系統中,系統會將其解析為相對路徑。例如:
/home/jakobjenkov/myfile.txt
將會被解析為路徑是在C盤。對應的絕對路徑是:
C:/home/jakobjenkov/myfile.txt
建立相對路徑Path
相對路徑指從一個已確定的路徑開始到某一檔案或資料夾的路徑。將確定路徑和相對路徑拼接起來就是相對路徑對應的絕對路徑地址。
java NIO Path類也能使用相對路徑。可以通過Paths.get(basePath, relativePath)建立一個相對路徑Path。示例如下:
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 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對應的路徑是當前執行程式目錄的上級目錄。
如果在path中使用..,表示上級目錄的含義。例如:
String path = "d:\\data\\projects\\a-project\\..\\another-project"; Path parentDir2 = Paths.get(path);
對應的絕對路徑地址為:
d:\data\projects\another-project
在a-project目錄後面的..符號,將指向的目錄修改為projects目錄,因此,最終path指向another-project目錄。
.和..都可以在Paths.get()的雙形參方法中使用。示例:
Path path1 = Paths.get("d:\\data\\projects", ".\\a-project"); Path path2 = Paths.get("d:\\data\\projects\\a-project", "..\\another-project");
下面介紹NIO 的Path類有關相對路徑的其他使用方法。
Path.normalize()
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);
上文示例,首先建立了一個包含..字元的路徑地址。之後輸出此路徑。
之後,呼叫normalize方法,返回一個新的path物件。輸出新物件的路徑。
輸出結果如下:
path1 = d:\data\projects\a-project\..\another-project path2 = d:\data\projects\another-project
如你所見,標準化後的路徑不再包含 a-project\..部分,因為它是多餘的。