1. 程式人生 > >Java NIO系列教程(十 五)Java NIO Path

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\..部分,因為它是多餘的。