中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java SE 7文件操作中的路徑操作是怎樣的

發布時間:2021-11-20 18:11:42 來源:億速云 閱讀:192 作者:柒染 欄目:編程語言

Java SE 7文件操作中的路徑操作是怎樣的,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。

Java SE 7中對Path類的操作主要有兩種:對路徑的操作和對文件的操作。我們就來了解一下對路徑的操作。

創建Path實例
Path實例包含了指定文件或目錄位置的信息,在實例化Path類時,需要指定一個或多個目錄或文件名。路徑的根目錄不是必須的;路徑信息可能僅僅是一個目錄或文件的名稱。
最簡單的創建Path實例的方式就是使用Paths(注意這里有一個s)類的get方法: 

Path p1 = Paths.get("/tmp/foo");     Path p2 = Paths.get(args[0]);     Path p3 = Paths.get("file:///Users/joe/FileTest.java");



Path類接受String或URI作為參數。

獲取路徑信息
前面我們已經說過了,File System一般是樹形結構,因此我們可以把Path理解為按順序存儲的一系列的名稱(目錄名稱和文件名稱)。目錄結構中***一層的目錄名就是序列中 index為0的那一個,目錄結構中***一層的目錄名或者文件名就是序列中index為n-1的那一個(這里n是路徑中層次的數目)。Path類提供方法來通過index獲取序列中的一個元素或一個子序列。
隨后的例子中我們使用的目錄結構如下圖:
Java SE 7文件操作中的路徑操作是怎樣的
    下面的代碼定義了一個Path對象并獲取其中的信息。要注意的是這些代碼中除了isHidden方法外,其他的方法并不需要指定的目錄或文件存在;如果不存在,isHidden方法會拋出異常。

Java代碼

Path path = Paths.get("C:\\home\\joe\\foo");    // Microsoft Windows syntax     //Path path = Paths.get("/home/joe/foo");    // Solaris syntax     System.out.format("toString: %s%n", path.toString());     System.out.format("getName: %s%n", path.getName());     System.out.format("getName(0): %s%n", path.getName(0));     System.out.format("getNameCount: %d%n", path.getNameCount());     System.out.format("subpath(0,2): %d%n", path.subpath(0,2));     System.out.format("getParent: %s%n", path.getParent());     System.out.format("getRoot: %s%n", path.getRoot());     System.out.format("isHidden: %s%n", path.isHidden());


下面是這段代碼的輸出情況



上面的代碼中我們創建Path時使用的是絕對路徑,下面我們來看看創建路徑時使用相對路徑時,這段代碼的執行結果:

Java代碼

//Path path = Paths.get("sally/bar");     // Solaris syntax     Path path = Paths.get("sally\\bar");    // Microsoft Windows syntax


大家可以自行去實驗一下具體的輸出是什么。

去除Path中的冗余
在很多文件系統中我們使用'.'來代表當前目錄,使用'..'代表父目錄。在有些情況下我們創建的路徑中會有冗余的路徑信息,例如:
        /home/./joe/foo
        /home/sally/../joe/foo
方法normalize會去除這些冗余信息,包括'.'或'directory/..'。上面的兩個例子在去除冗余信息后都是/home/joe/foo。
要注意的是normalize方法并不去檢查文件系統,它只是簡單的進行語法操作。在第二個例子中,如果sally是一個指向其他的目錄的符號鏈接,那么去除了sally/..后可能導致Path不在指向原來的文件或目錄。
如果你需要清除冗余信息,又要保證結果仍然指向正確的文件或目錄,可以使用toRealPath方法。在下面我們會講到這個方法。

轉換Path
有3個方法用來轉換Path。
    * toUri方法
      如果你需要將Path轉換為可以在瀏覽器中打開的字符串格式,可以使用toUri方法,例如:

Java代碼

Path p1 = Paths.get("/home/logfile");     System.out.format("%s%n", p1.toUri());  // 結果是 file:///home/logfile


      注意在這里即使/home/logfile'指向的目錄或文件不存在,這段代碼同樣能夠執行成功。
    * toAbsolutePath方法
      該方法將路徑轉換為絕對路徑。如果原來的Path已經是絕對路徑,該方法直接返回原有的Path對象。
      我們來看看下面的例子:
 

Java代碼

Path path = Paths.get("home\\joe\\foo");     Path absolutePath = path.toAbsolutePath();     System.out.println(path == absolutePath); //結果是false         Path path3 = Paths.get("c:\\home\\joe\\foo ");     Path absolutePath3 = path3.toAbsolutePath();     System.out.println(path3 == absolutePath3);//結果是true


      同樣的,toAbsolutePath方法并不需要Path所指向的文件或目錄存在。
    * toRealPath方法
      這個方法會返回一個已經存在的文件或目錄的真實路徑(如果文件或目錄不存在或無法訪問,該方法會拋出異常)。該方法會執行以下的操作:
      如果傳入的參數是true并且文件系統支持符號鏈接,則解析路徑中存在的符號鏈接(如果有的話)。
      如果原來的Path是相對路徑,將其轉換成絕對路徑。
      如果路徑中含有冗余信息,返回的Path中這些冗余信息會被去除。


連接兩個Path
可以使用resolve方法來將兩個Path連接起來。該方法的參數是一個字符串。如果該字符串代表的是一個相對路徑,那么這個路徑會被擴展到原來的路徑后。如果傳入的字符串是一個絕對路徑,那么返回的值就是傳入的這個絕對路徑。例如:

Java代碼

Path p1 = Paths.get("C:\\home\\joe\\foo");        System.out.format("%s%n", p1.resolve("bar")); // 結果是 C:\home\joe\foo\bar         Paths.get("foo").resolve("c:\\home\joe");       // 結果是  C:\home\joe


創建兩個路徑之間的路徑
這個功能說起來有些繞口,實際的功能就是創建兩個指定的目錄或文件之間的相對路徑。例如:

Java代碼

Path p1 = Paths.get("joe/foo");     Path p2 = Paths.get("sally");


在這個例子中,由于兩個路徑都是相對路徑,沒有其他的信息,我們會認為這兩個joe和sally是同一級的兄弟目錄,因此有以下的結果

Java代碼

Path p1_to_p2 = p1.relativize(p2);   // 結果是 ../../sally     Path p2_to_p1 = p2.relativize(p1);   // 結果是 ../joe/foo


讓我們看看另外一個例子:

Java代碼

Path p1 = Paths.get("home");     Path p3 = Paths.get("home/sally/bar");     Path p1_to_p3 = p1.relativize(p3);  // 結果是 sally/bar     Path p3_to_p1 = p3.relativize(p1);  // 結果是 ../..


在這個例子中,兩個路徑共享同一個節點-home,所以結果并不是../home/sally/bar和../../../home.
如果兩個路徑中有一個是絕對路徑,另外一個是相對路徑,relative方法會拋出異常。如果兩個路徑都是絕對路徑,那么relative方法的行為和系統相關,不同的系統可能不同。
我在Windows操作系統下實驗了一下,如果兩個路徑屬于同一個硬盤,那么可以執行成功,否則會拋出異常。

Java代碼

Path path2 = Paths.get("c:\\abcd\\efg");     Path path3 = Paths.get("c:\\temp");     System.out.println(path2.relativize(path3));        //結果是..\..\temp     System.out.println(path3.relativize(path2));        //結果是..\abcd\efg         Path path4 = Paths.get("c:\\abcd\\efg");     Path path5 = Paths.get("d:\\temp");     System.out.println(path4.relativize(path5));        //拋出異常


Path的比較
Path提供equals方法來檢查兩個Path是否相等。但是這里要注意的是比較的并不是兩個Path是否指向同一個目錄或者文件。請看下面的例子:

Java代碼

Path path2 = Paths.get("abcd\\123");     Path path3 = Paths.get("abcd\\123");     Path path4 = Paths.get("abcd\\.\\123");     System.out.println(path2.equals(path3));        //true     System.out.println(path2.equals(path4));        //false     System.out.println(path2.equals(path4.normalize())); //true     System.out.println(path2.equals(path2.toAbsolutePath()));        //false


Path類還提供了startsWith和endsWith方法,這兩個方法用來檢查路徑是否以指定的字符串開始或者結束,例如:

Java代碼

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類實現了Iterable接口,iterator方法會返回一個Iterator對象,該對象中的***個元素就是原路徑中最上層(最靠近根節點)的目錄。下面是使用這個方法的例子:

Java代碼

Path path = ...;     for (Path name: path) {         System.out.println(name);     }


Path類還實現了Comparable接口,因此可以使用compareTo來比較兩個Path。比較的算法和結果是和文件系統的提供者和系統平臺相關的。大家在使用之前,***先實驗一下。
Path 類還提供了一個方法isSameFile來檢查兩個Path是否指向同一個目錄或文件。如果作為參數的Path為null,那么會直接返回false,不會去檢查Path指向的文件是否存在。如果兩Path來自不同的文件系統提供者,那么也會直接返回false,不會去檢查文件或目錄是否存在。如果兩個 Path執行equals方法的返回結果為true,那么這個方法直接返回true,也不會去檢查文件或目錄是否存在。其他的情況下是否會去打開或訪問 Path指向的文件或目錄是與具體的實現相關的,也就是說不同的JDK/JRE可能會有不同的行為。
驗證文件或目錄是否存在
上面所介紹的很多方法都不會去驗證Path指向的文件或目錄是否存在,只是操作Path實例自身。但是在有些情況下,你需要訪問文件系統來驗證文件、目錄存在與否,這時你可以使用exists和notExists方法。需要注意的是!path.exists()并不等于path.notExists()。當你調用這兩個方法時,有以下3中情況:

    * 文件或者目錄被證實存在
    * 文件或者目錄被證實不存在
    * 不知道文件或目錄是否存在。當程序沒有訪問這個文件或目錄的權限的時候這個情況會發生。
如果exists()和notExists()都返回false,說明無法驗證該文件是否存在。

看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

从化市| 礼泉县| 奇台县| 定陶县| 星子县| 井研县| 永宁县| 文化| 刚察县| 大石桥市| 西贡区| 循化| 双牌县| 邓州市| 浙江省| 竹北市| 陆丰市| 芜湖县| 喜德县| 庆元县| 东源县| 科技| 赤峰市| 广丰县| 甘德县| 巴林右旗| 新密市| 兴安县| 安平县| 法库县| 南平市| 连州市| 孝昌县| 石阡县| 漠河县| 周宁县| 温州市| 鄂托克旗| 桑日县| 平果县| 界首市|