15 Java NIO Path-翻譯

王金龍發表於2017-12-06

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..==。因為它是冗餘的。刪除的部分不會在最終的絕對路徑中新增任何東西。

相關文章