鍍金池/ 教程/ Java/ Java路徑
Java文件屬性
Java FilePermission示例
Java Externalizable實例
Java文件操作
Java文件鎖
Java文件系統(tǒng)
Java異步I/O
Java Reader/Writer
Java File實例
Java FileReader示例
Java控制臺
Java文件所有者權(quán)限
Java通道
Java ByteArrayOutputStream示例
BufferedOutputStream示例
Java FileInputStream示例
Java DataInputStream
Java BufferedInputStream
Java Jar Manifest
Java Console類示例
BufferedWriter示例
Java輸入/輸出教程
Java對象序列化
Java文件教程
Java DataInputStream類型
Java Zip字節(jié)數(shù)組
Java FileWriter示例
FileOutputStream示例
Java PrintStream
Java Scanner類
BufferedInputStream示例
Java字符集
ByteArrayInputStream示例
Java路徑操作
Java DataOutputStream
Java符號鏈接
Java FilterWriter示例
Java Jar API
BufferedReader實例
Java Pipe(管道)
Java jar文件
Java CharArrayReader示例
Java CharArrayWriter示例
Java PushbackInputStream
Java FilterReader示例
Java zip文件
Java InputStream
Java標準輸入/輸出/錯誤流
Java文件內(nèi)容和讀寫
Java FilterInputStream示例
Java內(nèi)存通道
Java路徑
Java令牌和字符串拆分
Java隨機訪問文件
Java文件樹
Java緩沖區(qū)讀寫
Java FileOutputStream
Java目錄事件
Java FilterOutputStream示例
Java DataOutputStream實例
FileDescriptor示例

Java路徑

Path對象表示文件系統(tǒng)中文件,目錄和符號鏈接的路徑。Pathjava.nio.file包中的一個接口。
當創(chuàng)建一個Path對象時,路徑不一定存在。路徑可以使用舊的java.io.File API??梢允褂?code>File類的方法toPath()File對象中獲取Path對象??梢允褂?code>Path對象的toFile()方法從Path對象中獲取File對象??梢詫?code>Path對象執(zhí)行兩種操作:

  • 路徑操作
  • 文件操作

可以使用Path來訪問路徑的組件,例如文件名,根名等。
可以比較和檢查路徑。 例如,檢查路徑以.txt結(jié)尾,比較兩個路徑是否相同,檢查路徑是絕對路徑還是相對路徑等。還可以組合和解析路徑。

需要使用Files類在Path對象上執(zhí)行文件I/O操作。

創(chuàng)建路徑(Path)對象

FileSystem對象充當工廠來創(chuàng)建Path對象。FilePath中的getPath()方法創(chuàng)建一個Path對象。
以下代碼在Windows上為文件路徑F:\website\yiibai\worksp\test1.txt創(chuàng)建一個Path對象:

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

可以在構(gòu)造Path對象時將路徑的組件單獨傳遞給getPath()方法。以下語句創(chuàng)建一個Path對象以表示W(wǎng)indows上的 F:\website\yiibai\worksp\test1.txt 路徑:

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

Paths類可以從路徑字符串或URI的組件創(chuàng)建一個Path對象。Paths.get()靜態(tài)方法創(chuàng)建一個Path對象。
以下創(chuàng)建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");

我們可以從一個空路徑創(chuàng)建一個Path對象,例如:Paths.get("")。具有空路徑的Path對象是指與當前工作目錄相同的默認目錄。

路徑的組件

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

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

getRoot()方法返回路徑的根。 如果路徑?jīng)]有根,它返回null

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

getFileName()方法返回由路徑表示的文件名。如果路徑?jīng)]有文件名,則返回null。 文件名是根的最遠組件。 例如,在路徑C:\Java_Dev\test1.txt中,test1.txt就是文件名。

可以通過使用isAbsolute()方法來檢查路徑是否代表絕對路徑。路徑不必存在以獲取有關(guān)其組件的信息。
以下代碼顯示了如何訪問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());
    }
}

上面的代碼生成以下結(jié)果。

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

不同形式的路徑

我們可以使用不同的類型來表示同一個路徑。 假設(shè)創(chuàng)建一個Path對象,如下所示:

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

這里,p1是相對路徑??梢允褂闷?code>toAbsolutePath()方法獲得由p1表示的絕對路徑,如下所示:

Path  p1AbsPath  = p1.toAbsolutePath();

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

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

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

我們可以使用toRealPath()方法來獲取現(xiàn)有文件的真實路徑。它返回一個現(xiàn)有文件的規(guī)范路徑。如果路徑表示符號鏈接,則它返回目標文件的實際路徑。

我們可以傳遞一個鏈接選項到這個方法,指示是否要跟蹤到它的目標的符號鏈接。如果路徑表示的文件不存在,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);

  }
}

上面的代碼生成以下結(jié)果。

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