Java路徑


Path物件表示檔案系統中檔案,目錄和符號連結的路徑。Pathjava.nio.file包中的一個介面。
當建立一個Path物件時,路徑不一定存在。路徑可以使用舊的java.io.File API。可以使用File類的方法toPath()File物件中獲取Path物件。可以使用Path物件的toFile()方法從Path物件中獲取File物件。可以對Path物件執行兩種操作:

  • 路徑操作
  • 檔案操作

可以使用Path來存取路徑的元件,例如檔案名,根名等。
可以比較和檢查路徑。 例如,檢查路徑以.txt結尾,比較兩個路徑是否相同,檢查路徑是絕對路徑還是相對路徑等。還可以組合和解析路徑。

需要使用Files類在Path物件上執行檔案I/O操作。

建立路徑(Path)物件

FileSystem物件充當工廠來建立Path物件。FilePath中的getPath()方法建立一個Path物件。
以下程式碼在Windows上為檔案路徑F:\website\yiibai\worksp\test1.txt建立一個Path物件:

Path  p1  = FileSystems.getDefault().getPath("F:\\website\\yiibai\\worksp\\test1.txt");

可以在構造Path物件時將路徑的元件單獨傳遞給getPath()方法。以下語句建立一個Path物件以表示Windows上的 F:\website\yiibai\worksp\test1.txt 路徑:

Path  p2  = FileSystems.getDefault().getPath("F:", "website", "yiibai","worksp","test1.txt");

Paths類可以從路徑字串或URI的元件建立一個Path物件。Paths.get()靜態方法建立一個Path物件。
以下建立Path物件以表示相同的路徑: F:\website\yiibai\worksp\test1.txt

Path  p3  = Paths.get("F:\\website\\yiibai\\worksp\\test1.txt");
Path  p4  = Paths.get("F:", "website", "yiibai","worksp","test1.txt");

我們可以從一個空路徑建立一個Path物件,例如:Paths.get("")。具有空路徑的Path物件是指與當前工作目錄相同的預設目錄。

路徑的元件

檔案系統中的路徑由一個或多個元件組成。getNameCount()方法返回除了根之外的Path物件中的元件數。
例如,路徑C:\Java_Dev\test1.txt由三個元件組成:C:的根,目錄名為Java_Devtest1.txt檔案的兩個元件。 在這種情況下,getNameCount()方法將返回2getName(int index)方法返回指定索引處的元件名稱。最靠近根的元件的索引為0

離根最遠的元件的索引為count - 1。在路徑:C:\Java_Dev\test1.txt中,Java_Dev元件的索引為0test1.txt元件的索引為1getParent()方法返回路徑的父級。 如果路徑沒有父級,則返回null
路徑 C:\Java_Dev\test.txt 的父目錄是 C:\Java_Dev 。相對路徑test.txt沒有父級。

getRoot()方法返回路徑的根。 如果路徑沒有根,它返回null

例如,Windows上的路徑C:\Java_Dev\test1.txt,則 C:\ 就是這個路徑的根。

getFileName()方法返回由路徑表示的檔案名。如果路徑沒有檔案名,則返回null。 檔案名是根的最遠元件。 例如,在路徑C:\Java_Dev\test1.txt中,test1.txt就是檔案名。

可以通過使用isAbsolute()方法來檢查路徑是否代表絕對路徑。路徑不必存在以獲取有關其元件的資訊。
以下程式碼顯示了如何存取Path物件的元件。

import java.nio.file.Path;
import java.nio.file.Paths;

public class Main {
    public static void main(String[] args) {
        Path p1 = Paths.get("F:\\website\\yiibai\\worksp\\test1.txt");
        printDetails(p1);

        Path p2 = Paths.get("test1.txt");
        printDetails(p2);
    }

    public static void printDetails(Path p) {
        System.out.println("Details for path: " + p);

        int count = p.getNameCount();
        System.out.println("Name count: " + count);

        for (int i = 0; i < count; i++) {
            Path name = p.getName(i);
            System.out.println("Name at  index   " + i + "  is " + name);
        }

        Path parent = p.getParent();
        Path root = p.getRoot();
        Path fileName = p.getFileName();
        System.out.println("Parent: " + parent + ", Root:   " + root + ", File Name: " + fileName);
        System.out.println("Absolute Path: " + p.isAbsolute());
    }
}

上面的程式碼生成以下結果。

Details for path: F:\website\yiibai\worksp\test1.txt
Name count: 4
Name at  index   0  is website
Name at  index   1  is yiibai
Name at  index   2  is worksp
Name at  index   3  is test1.txt
Parent: F:\website\yiibai\worksp, Root:   F:\, File Name: test1.txt
Absolute Path: true
Details for path: test1.txt
Name count: 1
Name at  index   0  is test1.txt
Parent: null, Root:   null, File Name: test1.txt
Absolute Path: false

不同形式的路徑

我們可以使用不同的型別來表示同一個路徑。 假設建立一個Path物件,如下所示:

Path  p1  = Paths.get("test.txt");

這裡,p1是相對路徑。可以使用其toAbsolutePath()方法獲得由p1表示的絕對路徑,如下所示:

Path  p1AbsPath  = p1.toAbsolutePath();

現在p1AbsPath是p1的絕對路徑。 例如,在Windows上,p1AbsPath就類似路徑的全名C:\testapp\test.txt

如果路徑不是絕對路徑,toAbsolutePath()方法使用預設目錄來解析路徑。

如果路徑是絕對路徑,toAbsolutePath()方法返回相同的路徑。

我們可以使用toRealPath()方法來獲取現有檔案的真實路徑。它返回一個現有檔案的規範路徑。如果路徑表示符號連結,則它返回目標檔案的實際路徑。

我們可以傳遞一個連結選項到這個方法,指示是否要跟蹤到它的目標的符號連結。如果路徑表示的檔案不存在,toRealPath()會丟擲一個IOException異常。

以下程式碼顯示了如何從Path物件獲取實際路徑:

import java.nio.file.LinkOption;
import java.nio.file.Path;
import java.nio.file.Paths;

public class Main {
  public static void main(String[] args) throws Exception {

    Path p2 = Paths.get("test2.txt");
    // Follow link for p2, if it is a symbolic link
    Path p2RealPath = p2.toRealPath();
    System.out.println("p2RealPath:" + p2RealPath);
    Path p3 = Paths.get("test3.txt");
    // Do not follow link for p3, if it is a symbolic link
    Path p3RealPath = p3.toRealPath(LinkOption.NOFOLLOW_LINKS);
    System.out.println("p3RealPath:" + p3RealPath);

  }
}

路徑URI

使用Path物件的toUri()方法來獲取其URI表示。以下程式碼顯示了如何獲取路徑的URI形式。

import java.nio.file.Path;
import java.nio.file.Paths;

public class Main {
  public static void main(String[] args) throws Exception {
    Path p2 = Paths.get("test2.txt");
    java.net.URI p2UriPath = p2.toUri();
    System.out.println("Absolute Path: " + p2.toAbsolutePath());
    System.out.println("URI Path: " + p2UriPath);

  }
}

上面的程式碼生成以下結果。

Absolute Path: F:\website\yiibai\worksp\test2.txt
URI Path: file:///F:/website/yiibai/worksp/test2.txt