日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
詳解JavaSE7文件操作之路徑操作

Java SE 7中對(duì)Path類的操作主要有兩種:對(duì)路徑的操作和對(duì)文件的操作。這篇文章中我們就來(lái)了解一下對(duì)路徑的操作。

創(chuàng)新互聯(lián)專注于富順網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠(chéng)為您提供富順營(yíng)銷型網(wǎng)站建設(shè),富順網(wǎng)站制作、富順網(wǎng)頁(yè)設(shè)計(jì)、富順網(wǎng)站官網(wǎng)定制、小程序定制開發(fā)服務(wù),打造富順網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供富順網(wǎng)站排名全網(wǎng)營(yíng)銷落地服務(wù)。

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

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

Path類接受String或URI作為參數(shù)。

獲取路徑信息
前面我們已經(jīng)說過了,F(xiàn)ile System一般是樹形結(jié)構(gòu),因此我們可以把Path理解為按順序存儲(chǔ)的一系列的名稱(目錄名稱和文件名稱)。目錄結(jié)構(gòu)中***一層的目錄名就是序列中 index為0的那一個(gè),目錄結(jié)構(gòu)中***一層的目錄名或者文件名就是序列中index為n-1的那一個(gè)(這里n是路徑中層次的數(shù)目)。Path類提供方法來(lái)通過index獲取序列中的一個(gè)元素或一個(gè)子序列。
隨后的例子中我們使用的目錄結(jié)構(gòu)如下圖:

    下面的代碼定義了一個(gè)Path對(duì)象并獲取其中的信息。要注意的是這些代碼中除了isHidden方法外,其他的方法并不需要指定的目錄或文件存在;如果不存在,isHidden方法會(huì)拋出異常。

Java代碼

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

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

上面的代碼中我們創(chuàng)建Path時(shí)使用的是絕對(duì)路徑,下面我們來(lái)看看創(chuàng)建路徑時(shí)使用相對(duì)路徑時(shí),這段代碼的執(zhí)行結(jié)果:

Java代碼

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

大家可以自行去實(shí)驗(yàn)一下具體的輸出是什么。

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

轉(zhuǎn)換Path
有3個(gè)方法用來(lái)轉(zhuǎn)換Path。
    * toUri方法
      如果你需要將Path轉(zhuǎn)換為可以在瀏覽器中打開的字符串格式,可以使用toUri方法,例如:

Java代碼

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

      注意在這里即使/home/logfile'指向的目錄或文件不存在,這段代碼同樣能夠執(zhí)行成功。

    * toAbsolutePath方法

      該方法將路徑轉(zhuǎn)換為絕對(duì)路徑。如果原來(lái)的Path已經(jīng)是絕對(duì)路徑,該方法直接返回原有的Path對(duì)象。

      我們來(lái)看看下面的例子:

  Java代碼

 
 
 
  1. Path path = Paths.get("home\\joe\\foo");   
  2. Path absolutePath = path.toAbsolutePath();   
  3. System.out.println(path == absolutePath); //結(jié)果是false   
  4.   
  5. Path path2 = Paths.get("c:\\home\\joe\\foo ");   
  6. Path absolutePath2 = path2.toAbsolutePath();   
  7. System.out.println(path2 == absolutePath2);//結(jié)果是true  

      同樣的,toAbsolutePath方法并不需要Path所指向的文件或目錄存在。
    * toRealPath方法
      這個(gè)方法會(huì)返回一個(gè)已經(jīng)存在的文件或目錄的真實(shí)路徑(如果文件或目錄不存在或無(wú)法訪問,該方法會(huì)拋出異常)。該方法會(huì)執(zhí)行以下的操作:
      如果傳入的參數(shù)是true并且文件系統(tǒng)支持符號(hào)鏈接,則解析路徑中存在的符號(hào)鏈接(如果有的話)。
      如果原來(lái)的Path是相對(duì)路徑,將其轉(zhuǎn)換成絕對(duì)路徑。
      如果路徑中含有冗余信息,返回的Path中這些冗余信息會(huì)被去除。

連接兩個(gè)Path
可以使用resolve方法來(lái)將兩個(gè)Path連接起來(lái)。該方法的參數(shù)是一個(gè)字符串。如果該字符串代表的是一個(gè)相對(duì)路徑,那么這個(gè)路徑會(huì)被擴(kuò)展到原來(lái)的路徑后。如果傳入的字符串是一個(gè)絕對(duì)路徑,那么返回的值就是傳入的這個(gè)絕對(duì)路徑。例如:

Java代碼

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

創(chuàng)建兩個(gè)路徑之間的路徑
這個(gè)功能說起來(lái)有些繞口,實(shí)際的功能就是創(chuàng)建兩個(gè)指定的目錄或文件之間的相對(duì)路徑。例如:

Java代碼

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

在這個(gè)例子中,由于兩個(gè)路徑都是相對(duì)路徑,沒有其他的信息,我們會(huì)認(rèn)為這兩個(gè)joe和sally是同一級(jí)的兄弟目錄,因此有以下的結(jié)果

Java代碼

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

讓我們看看另外一個(gè)例子:

Java代碼

 
 
 
  1. Path p1 = Paths.get("home");   
  2. Path p3 = Paths.get("home/sally/bar");   
  3. Path p1_to_p3 = p1.relativize(p3);  // 結(jié)果是 sally/bar   
  4. Path p3_to_p1 = p3.relativize(p1);  // 結(jié)果是 ../..  

在這個(gè)例子中,兩個(gè)路徑共享同一個(gè)節(jié)點(diǎn)-home,所以結(jié)果并不是../home/sally/bar和../../../home.
如果兩個(gè)路徑中有一個(gè)是絕對(duì)路徑,另外一個(gè)是相對(duì)路徑,relative方法會(huì)拋出異常。如果兩個(gè)路徑都是絕對(duì)路徑,那么relative方法的行為和系統(tǒng)相關(guān),不同的系統(tǒng)可能不同。
我在Windows操作系統(tǒng)下實(shí)驗(yàn)了一下,如果兩個(gè)路徑屬于同一個(gè)硬盤,那么可以執(zhí)行成功,否則會(huì)拋出異常。

Java代碼

 
 
 
  1. Path path1 = Paths.get("c:\\abcd\\efg");   
  2. Path path2 = Paths.get("c:\\temp");   
  3. System.out.println(path1.relativize(path2));        //結(jié)果是..\..\temp   
  4. System.out.println(path2.relativize(path1));        //結(jié)果是..\abcd\efg   
  5.   
  6. Path path3 = Paths.get("c:\\abcd\\efg");   
  7. Path path4 = Paths.get("d:\\temp");   
  8. System.out.println(path3.relativize(path4));        //拋出異常  

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

Java代碼

 
 
 
  1. Path path1 = Paths.get("abcd\\123");   
  2. Path path2 = Paths.get("abcd\\123");   
  3. Path path3 = Paths.get("abcd\\.\\123");   
  4. System.out.println(path1.equals(path2));        //true   
  5. System.out.println(path1.equals(path3));        //false   
  6. System.out.println(path1.equals(path3.normalize())); //true   
  7. System.out.println(path1.equals(path1.toAbsolutePath()));        //false  

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

Java代碼

 
 
 
  1. Path path = ...;   
  2. Path otherPath = ...;   
  3. Path beginning = Paths.get("/home");   
  4. Path ending = Paths.get("foo");   
  5.   
  6. if (path.equals(otherPath)) {   
  7.     //equality logic here   
  8. } else if (path.startsWith(beginning)) {   
  9.     //path begins with "/home"   
  10. } else if (path.endsWith(ending)) {   
  11.     //path ends with "foo"   
  12. }  

Path類實(shí)現(xiàn)了Iterable接口,iterator方法會(huì)返回一個(gè)Iterator對(duì)象,該對(duì)象中的***個(gè)元素就是原路徑中最上層(最靠近根節(jié)點(diǎn))的目錄。下面是使用這個(gè)方法的例子:

Java代碼

 
 
 
  1. Path path = ...;   
  2. for (Path name: path) {   
  3.     System.out.println(name);   
  4. }  

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

    * 文件或者目錄被證實(shí)存在
    * 文件或者目錄被證實(shí)不存在
    * 不知道文件或目錄是否存在。當(dāng)程序沒有訪問這個(gè)文件或目錄的權(quán)限的時(shí)候這個(gè)情況會(huì)發(fā)生。
如果exists()和notExists()都返回false,說明無(wú)法驗(yàn)證該文件是否存在。


當(dāng)前名稱:詳解JavaSE7文件操作之路徑操作
路徑分享:http://www.5511xx.com/article/dpihspd.html