日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

File IO(NIO.2):路径类 和 路径操作

發(fā)布時間:2025/7/14 编程问答 64 豆豆
生活随笔 收集整理的這篇文章主要介紹了 File IO(NIO.2):路径类 和 路径操作 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

路徑類

Java SE 7版本中引入的Path類是java.nio.file包的主要入口點之一。如果您的應(yīng)用程序使用文件I / O,您將需要了解此類的強大功能。?

版本注意:如果您有使用java.io.File的JDK7之前的代碼,則仍然可以使用File.toPath方法來利用Path類功能。有關(guān)詳細(xì)信息,請參閱傳統(tǒng)文件I / O代碼。?

顧名思義,Path類是文件系統(tǒng)中路徑的編程表示形式。路徑對象包含用于構(gòu)建路徑的文件名和目錄列表,用于檢查,定位和操作文件。?

路徑實例反映了底層平臺。在Solaris OS中,路徑使用Solaris語法(/ home / joe / foo),而在Microsoft Windows中,路徑使用Windows語法(C:\ home \ joe \ foo)。路徑與系統(tǒng)無關(guān)。您不能將Solaris與Solaris文件系統(tǒng)進行比較,并期望它與Windows文件系統(tǒng)中的路徑相匹配,即使目錄結(jié)構(gòu)相同,并且兩個實例都找到相同的相對文件。?

與Path相對應(yīng)的文件或目錄可能不存在。您可以創(chuàng)建一個Path實例并以各種方式進行操作:您可以附加它,提取它,并將其與其他路徑進行比較。在適當(dāng)?shù)臅r候,您可以使用Files類中的方法檢查與Path對應(yīng)的文件的存在,創(chuàng)建文件,打開它,刪除它,更改其權(quán)限等。?

下一頁將詳細(xì)介紹Path類。

路徑操作

簡介

Path類包括可用于獲取有關(guān)路徑,路徑訪問元素,將路徑轉(zhuǎn)換為其他窗體或提取路徑部分的信息的各種方法。還有一些方法可以匹配路徑字符串和方法來刪除路徑中的冗余。這個課程解決了這些Path方法,有時被稱為語法操作,因為它們在路徑本身上操作,并且不訪問文件系統(tǒng)。

創(chuàng)建一個路徑

路徑實例包含用于指定文件或目錄位置的信息。在定義的時候,路徑被提供有一系列一個或多個名稱??赡馨鼗蛭募?#xff0c;但不是必需的。路徑可能只包含一個目錄或文件名。 您可以通過使用路徑中的以下幫助類中的方法之一輕松創(chuàng)建一個Path對象(注意復(fù)數(shù)):
Path p1 = Paths.get("/tmp/foo"); Path p2 = Paths.get(args[0]); Path p3 = Paths.get(URI.create("file:///Users/joe/FileTest.java"));Paths.get方法是以下代碼的縮寫:
Path p4 = FileSystems.getDefault().getPath("/users/sally");
以下示例創(chuàng)建/u/joe/logs/foo.log,假設(shè)您的主目錄是/ u / joe,或者C:\ joe \ logs \ foo.log(如果您在Windows上)。

Path p5 = Paths.get(System.getProperty("user.home"),"logs", "foo.log");

檢索路徑信息

您可以將路徑視為將這些名稱元素作為序列存儲。目錄結(jié)構(gòu)中的最高元素將位于索引0.目錄結(jié)構(gòu)中的最低元素將位于索引[n-1],其中n是路徑中名稱元素的數(shù)量。方法可用于使用這些索引檢索單個元素或路徑的子序列。? 本課程中的示例使用以下目錄結(jié)構(gòu)。


以下代碼片段定義了一個Path實例,然后調(diào)用幾個方法來獲取有關(guān)該路徑的信息:
// None of these methods requires that the file corresponding // to the Path exists. // Microsoft Windows syntax Path path = Paths.get("C:\\home\\joe\\foo");// Solaris syntax Path path = Paths.get("/home/joe/foo");System.out.format("toString: %s%n", path.toString()); System.out.format("getFileName: %s%n", path.getFileName()); System.out.format("getName(0): %s%n", path.getName(0)); System.out.format("getNameCount: %d%n", path.getNameCount()); System.out.format("subpath(0,2): %s%n", path.subpath(0,2)); System.out.format("getParent: %s%n", path.getParent()); System.out.format("getRoot: %s%n", path.getRoot());以下是Windows和Solaris操作系統(tǒng)的輸出:
上一個示例顯示絕對路徑的輸出。在以下示例中,指定了相對路徑:
// Solaris syntax Path path = Paths.get("sally/bar"); or // Microsoft Windows syntax Path path = Paths.get("sally\\bar");以下是Windows和Solaris OS的輸出:

從路徑中刪除冗余數(shù)據(jù)

許多文件系統(tǒng)使用“.” 表示當(dāng)前目錄的符號,“..”表示父目錄。 您可能會遇到路徑包含冗余目錄信息的情況。 也許服務(wù)器配置為將其日志文件保存在“/ dir / logs /”中。 目錄,并且您想要刪除尾隨的“/”。?
以下示例都包括冗余:
/home/./joe/foo
/home/sally/../joe/foo
normalize方法刪除任何冗余元素,其中包括任何“.”或“目錄/ ..”出現(xiàn)。以上兩個例子都?xì)w結(jié)為/ home / joe / foo。? 重要的是要注意,normalize在文件系統(tǒng)清理路徑時不檢查。這是一個純粹的句法操作。在第二個例子中,如果sally是一個符號鏈接,則刪除sally / ..可能會導(dǎo)致一個不再定位目標(biāo)文件的路徑。 要清理路徑,同時確保結(jié)果找到正確的文件,可以使用toRealPath方法。該方法在下一節(jié)“轉(zhuǎn)換路徑”中進行了說明。

轉(zhuǎn)換路徑

您可以使用三種方法來轉(zhuǎn)換路徑。如果您需要將路徑轉(zhuǎn)換為可以從瀏覽器打開的字符串,則可以使用toUri。例如: Path p1 = Paths.get("/home/logfile"); // Result is file:///home/logfile System.out.format("%s%n", p1.toUri());toAbsolutePath方法將路徑轉(zhuǎn)換為絕對路徑。如果傳入路徑已經(jīng)是絕對路徑,則返回相同的路徑對象。在處理用戶輸入的文件名時,toAbsolutePath方法非常有用。例如:
public class FileTest {public static void main(String[] args) {if (args.length < 1) {System.out.println("usage: FileTest file");System.exit(-1);}// Converts the input string to a Path object.Path inputPath = Paths.get(args[0]);// Converts the input Path// to an absolute path.// Generally, this means prepending// the current working// directory. If this example// were called like this:// java FileTest foo// the getRoot and getParent methods// would return null// on the original "inputPath"// instance. Invoking getRoot and// getParent on the "fullPath"// instance returns expected values.Path fullPath = inputPath.toAbsolutePath();} }toAbsolutePath方法轉(zhuǎn)換用戶輸入并返回一個在查詢時返回有用值的路徑。該文件不需要存在,以使此方法正常工作。? toRealPath方法返回現(xiàn)有文件的真實路徑。該方法可以執(zhí)行多個操作:? 1,如果true傳遞給此方法,并且文件系統(tǒng)支持符號鏈接,則此方法可以解析路徑中的任何符號鏈接。? 2,如果路徑是相對的,則返回絕對路徑。? 3,如果路徑包含任何冗余元素,它將返回一個刪除這些元素的路徑。 ?如果文件不存在或無法訪問,此方法將拋出異常。當(dāng)您想處理這些情況時,您可以捕獲異常。例如:
try {Path fp = path.toRealPath(); } catch (NoSuchFileException x) {System.err.format("%s: no such" + " file or directory%n", path);// Logic for case when file doesn't exist. } catch (IOException x) {System.err.format("%s%n", x);// Logic for other sort of file error. }

聯(lián)合兩個路徑

你可以組合路徑,通過使用resolve方法。 通過訪問部分路徑——不包括根節(jié)點,并且這個部分路徑可以被添加到原始路徑 例如:思考以下代碼: // Solaris Path p1 = Paths.get("/home/joe/foo"); // Result is /home/joe/foo/bar System.out.format("%s%n", p1.resolve("bar"));或者 // Microsoft Windows Path p1 = Paths.get("C:\\home\\joe\\foo"); // Result is C:\home\joe\foo\bar System.out.format("%s%n", p1.resolve("bar"));將絕對路徑傳遞給resolve方法返回傳入路徑: // Result is /home/joe Paths.get("foo").resolve("/home/joe");

在兩個路徑之間創(chuàng)建一個新的路徑

一個很常見的需求是:當(dāng)你在使用IO代碼時,需要從一個文件系統(tǒng)的路徑構(gòu)建一個新的路徑到另一個地方。你可以使用relativize方法,這個方法構(gòu)建了從原來的路徑和終點位置的路徑中構(gòu)建一個路徑,這個新的路徑對于原始路徑來說,是相對的: 例如:思考下面被定義為 Joe 和 Sally 的相對路徑: Path p1 = Paths.get("joe"); Path p2 = Paths.get("sally");對于其他信息而言,假設(shè) Joe 和 Sally是兄妹,這意味著這個節(jié)點在樹結(jié)構(gòu)中有著同等的等級。 要想通過 Joe找到Sally,你可能需要首先找到這個父節(jié)點,然后找到Sally。 // Result is ../sally Path p1_to_p2 = p1.relativize(p2); // Result is ../joe Path p2_to_p1 = p2.relativize(p1);再看一個略微復(fù)雜的例子: Path p1 = Paths.get("home"); Path p3 = Paths.get("home/sally/bar"); // Result is sally/bar Path p1_to_p3 = p1.relativize(p3); // Result is ../.. Path p3_to_p1 = p3.relativize(p1);在這個例子中,兩個路徑共享了一個節(jié)點:home。 從home找到了bar,首先需要找到一個等級(home),然后再查找下一個等級找到Sally,最后再找到bar。從bar要找到home,需要向上查找兩個等級。 不能創(chuàng)建一個相對路徑,如果這個路徑包含根節(jié)點。如果這個路徑包含根節(jié)點,只有系統(tǒng)有創(chuàng)建這個相對路徑的能力。
這個Copy 的遞歸例子,使用了relativize 和 resolve 方法。

比較兩個路徑

Path 類支持equals方法,這個方法讓你可以檢測兩個路徑是否一致。這個startsWith和endWith方法,使你可以檢測任意一個以部分字符開始或結(jié)束的路徑。這些方法使用起來都很簡單,例如: Path path = ...; Path otherPath = ...; Path beginning = Paths.get("/home"); Path ending = Paths.get("foo");if (path.equals(otherPath)) {// equality logic here } else if (path.startsWith(beginning)) {// path begins with "/home" } else if (path.endsWith(ending)) {// path ends with "foo" }
Path類實現(xiàn)了Iterable接口,iterator方法返回一個對象,而這個對象讓你可以遍歷路徑中的所有節(jié)點名稱。第一個被返回的節(jié)點,是離目錄樹最近的根節(jié)點。下面的代碼簡單的遍歷了一個路徑,并打印每一個節(jié)點的名稱:
Path path = ...; for (Path name: path) {System.out.println(name); }Path類同樣實現(xiàn)了comparable接口,你可以比較路徑對象通過comparaTo方法,這個方法對于排序也同樣有用。 你也可以將一個Path對象放入一個collection ,查看集合 教程了解更多有用的功能。 當(dāng)你想確認(rèn)兩個路徑對象是同一個文件時,你可以使用isSameFile方法,這個方法被描述在:檢測兩個路徑是否存在于同一個文件

轉(zhuǎn)載于:https://www.cnblogs.com/hhx626/p/8320405.html

總結(jié)

以上是生活随笔為你收集整理的File IO(NIO.2):路径类 和 路径操作的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。