Java 路徑

2018-02-05 16:52 更新

Java IO教程 - Java路徑


Path 對(duì)象表示文件系統(tǒng)中文件,目錄和符號(hào)鏈接的路徑。

Path 是java.nio.file包中的一個(gè)接口。

當(dāng)我們創(chuàng)建一個(gè)Path對(duì)象時(shí),路徑不一定存在。

Path 可以使用舊的java.io.File apI。我們可以使用File類的方法toPath()從File對(duì)象中獲取一個(gè)Path對(duì)象

我們可以使用Path對(duì)象的toFile()方法從Path對(duì)象中獲取File對(duì)象。

我們可以對(duì)Path對(duì)象執(zhí)行兩種操作:

  • 路徑操作
  • 文件操作

我們可以使用 Path 來訪問路徑的組件,例如文件名,根名等。

我們可以比較和檢查路徑。例如,檢查路徑以.txt結(jié)尾,比較兩個(gè)路徑是否相同,檢查路徑是絕對(duì)路徑還是相對(duì)路徑等。我們還可以組合和解析路徑。

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


創(chuàng)建路徑對(duì)象

FileSystem對(duì)象充當(dāng)工廠來創(chuàng)建Path對(duì)象

FilePath中的getPath()方法創(chuàng)建一個(gè)Path對(duì)象。

以下代碼在Windows上為文件路徑C:\Java_Dev\test1.txt創(chuàng)建一個(gè)Path對(duì)象:

Path  p1  = FileSystems.getDefault().getPath("C:\\Java_Dev\\test1.txt");

我們可以在構(gòu)造Path對(duì)象時(shí)將路徑的組件單獨(dú)傳遞給getPath()方法。

以下語句創(chuàng)建一個(gè)Path對(duì)象以表示W(wǎng)indows上的C:\Java_Dev\test1.txt路徑:

Path  p2  = FileSystems.getDefault().getPath("C:", "Java_Dev",   "test1.txt");

Paths 類可以從路徑字符串或URI的組件創(chuàng)建 Path 對(duì)象。

Paths.get()靜態(tài)方法創(chuàng)建一個(gè)Path對(duì)象。

以下創(chuàng)建 Path 對(duì)象來表示相同的路徑C:\Java_Dev\test1.txt:

Path  p3  = Paths.get("C:\\Java_Dev\\test1.txt");
Path  p4  = Paths.get("C:", "Java_Dev", "test1.txt");

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


路徑的組件

文件系統(tǒng)中的路徑由一個(gè)或多個(gè)組件組成。

getNameCount()方法返回除了根之外的Path對(duì)象中的組件數(shù)量。

例如,路徑C:\Java_Dev\test1.txt由三個(gè)組件組成:C:的根和名為Java_Dev和test1.txt的兩個(gè)組件。這種情況下,getNameCount()方法將返回2。

getName(int index)方法返回指定索引處的組件名稱。最靠近根的組件的索引為0。

離根最遠(yuǎn)的組件的索引為count - 1.在路徑中。

C:\Java_Dev\test1.txt,Java_Dev組件的索引為0,test1.txt組件的索引為1。

getParent()方法返回路徑的父代。如果路徑?jīng)]有父級(jí),則返回null。

路徑C:\Java_Dev\test.txt的父目錄是C:\Java_Dev。

相對(duì)路徑test.txt沒有父級(jí)。

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

例如,Windows上的路徑C:\Java_Dev\test1.txt具有C:\作為其根。

getFileName()方法返回由路徑表示的文件名。

如果路徑?jīng)]有文件名,則返回null。文件名是根的最遠(yuǎn)組件。例如,在路徑C:\Java_Dev\test1.txt中,test1.txt是文件名。

我們可以通過使用isAbsolute()方法來檢查路徑是否代表絕對(duì)路徑。

路徑不必存在以獲取有關(guān)其組件的信息。

以下代碼顯示了如何訪問Path對(duì)象的組件。

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

public class Main {
  public static void main(String[] args) {
    Path p1 = Paths.get("C:\\Java_Dev\\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é)果。


不同形式的路徑

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

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

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

Path  p1AbsPath  = p1.toAbsolutePath();

現(xiàn)在p1AbsPath是p1的絕對(duì)路徑。例如,在Windows上,p1AbsPath可能看起來像C:\testapp\test.txt。

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

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

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

我們可以傳遞一個(gè)鏈接選項(xiàng)到這個(gè)方法,指示我們是否要跟蹤到它的目標(biāo)的符號(hào)鏈接。

如果路徑表示的文件不存在,toRealPath()會(huì)拋出一個(gè)IOException異常。

以下代碼顯示了如何從Path對(duì)象獲取實(shí)際路徑:

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é)果。

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)