1. 程式人生 > >《Java NIO教程》Java NIO Path

《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..多餘的部分,移除的部分對於絕對路徑是無關緊要的。