Java NIO 教程(十四) Java NIO Path

原文地址

目錄

Java Path接口是Java NIO 2更新的一部分,同Java NIO一起已經包括在Java6和Java7中。Java Path接口是在Java7中添加到Java NIO的。Path接口位于java.nio.file包中,所以Path接口的完全限定名稱為java.nio.file.Path

Java Path實例表示文件系統中的路徑。一個路徑可以指向一個文件或一個目錄。路徑可以是絕對路徑,也可以是相對路徑。絕對路徑包含從文件系統的根目錄到它指向的文件或目錄的完整路徑。相對路徑包含相對于其他路徑的文件或目錄的路徑。相對路徑可能聽起來有點混亂。別擔心。我將在稍后的Java NIO路徑教程中詳細解釋相關路徑。

不要將文件系統路徑與某些操作系統中的path環境變量混淆。java.nio.file.Path接口與path環境變量沒有任何關系。

在許多方面,java.nio.file.Path接口類似于java.io.File類,但是有一些細微的差別。不過,在許多情況下,您可以使用Path接口來替換File類的使用。

創建一個Path實例

為了使用java.nio.file.Path實例必須創建一個Path實例。您可以使用Paths類(java.nio.file.Paths)中的靜態方法來創建路徑實例,名為Paths.get()。下面是一個Java 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");

    }
}

請注意示例頂部的兩個導入語句。要使用Path接口和Paths類,我們必須首先導入它們。

其次,注意Paths.get("c:\\data\\myfile.txt")方法調用。它是調用Path實例的Paths.get()方法。換句話說,Paths.get()方法是Path實例的工廠方法。

創建一個絕對路徑

創建絕對路徑是通過調用Paths.get()工廠方法,給定絕對路徑文件作為參數來完成的。下面是創建一個表示絕對路徑的路徑實例的例子:

Path path = Paths.get("c:\\data\\myfile.txt");

絕對路徑是c:\data\myfile.txt。在Java字符串中,重復\字符是必需的,因為\是一個轉義字符,這意味著下面的字符告訴我們在字符串中的這個位置要定位什么字符。通過編寫\\,您可以告訴Java編譯器在字符串中寫入一個\字符。

上面的路徑是一個Windows文件系統路徑。在Unix系統(Linux、MacOS、FreeBSD等)上,上面的絕對路徑可能如下:

Path path = Paths.get("/home/jakobjenkov/myfile.txt");

絕對路徑現在為/home/jakobjenkov/myfile.txt.

如果您在Windows機器上使用了這種路徑(從/開始的路徑),那么路徑將被解釋為相對于當前驅動器。例如,路徑

/home/jakobjenkov/myfile.txt

可以將其解釋為位于C盤驅動器上。那么這條路徑就會對應這條完整的路徑:

C:/home/jakobjenkov/myfile.txt

創建一個相對路徑

相對路徑是指從一條路徑(基本路徑)指向一個目錄或文件的路徑。一條相對路徑的完整路徑(絕對路徑)是通過將基本路徑與相對路徑相結合而得到的。

Java NIO Path類也可以用于處理相對路徑。您可以使用Paths.get(basePath, relativePath)方法創建一個相對路徑。下面是Java中的兩個相對路徑示例:

Path projects = Paths.get("d:\\data", "projects");

Path file     = Paths.get("d:\\data", "projects\\a-project\\myfile.txt");

第一個例子創建了一個Java Path的實例,指向路徑(目錄):d:\data\projects,第二個例子創建了一個Path的實例,指向路徑(文件):d:\data\projects\a-project\myfile.txt

當在工作中使用相對路徑時,你可以在你的路徑字符串中使用兩個特殊代碼,它們是:

  • .
  • ..

代碼.表示“當前目錄”,例如,如果你創建了這樣一個相對路徑:

Path currentDir = Paths.get(".");
System.out.println(currentDir.toAbsolutePath());

然后,Java Path實例對應的絕對路徑將是執行上述代碼的應用程序的目錄。

如果。在路徑字符串的中間使用.,表示同樣的目錄作為路徑指向那個點。這里有一個例子說明了這一點:

Path currentDir = Paths.get("d:\\data\\projects\.\a-project");

這條路徑將對應于路徑:

d:\data\projects\a-project

..表示“父目錄”或者“上一級目錄”,這里有一個Path的Java例子表明這一點:

Path parentDir = Paths.get("..");

這個例子創建的Path實例對應于運行該代碼的應用程序的父目錄。

如果你在路徑字符串代碼中間使用..,它將對應于在路徑字符串的那個點上改變一個目錄。例如:

String path = "d:\\data\\projects\\a-project\\..\\another-project";
Path parentDir2 = Paths.get(path);

這個示例創建的Java Path實例將對應于這個絕對路徑:

d:\data\projects\another-project

a-project目錄之后的..代碼,會修改目錄到項目的父目錄中,所以這個目錄是指向another-project目錄。

...代碼也可以用于兩個子富川的合并方法Paths.get()中。下面是兩個簡單演示Java 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()

Path接口的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示例首先創建一個中間帶有..代碼的路徑字符串。然后,這個示例從這個路徑字符串創建一個Path實例,并將該Path實例打印出來(實際上它會打印Path.toString())。

然后,該示例在創建的Path實例上調用normalize()方法,該實例返回一個新的Path實例。這個新的、標準化的路徑實例也會被打印出來。

下面是上述示例的輸出:

path1 = d:\data\projects\a-project\..\another-project
path2 = d:\data\projects\another-project

正如您所看到的,標準化的路徑不包含a-project\..部分,因為這是多余的。移除的部分不會增加最終的絕對路徑。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,967評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,273評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,870評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,742評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,527評論 6 407
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,010評論 1 322
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,108評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,250評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,769評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,656評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,853評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,371評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,103評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,472評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,717評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,487評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,815評論 2 372

推薦閱讀更多精彩內容