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