小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

Java 中 File.getPath() getAbsolutePath()和getCanonicalPath()的不同

 CevenCheng 2010-08-18
引用
http://www./dreamstone/archive/2007/08/08/134968.html

file的這幾個取得path的方法各有不同,下邊說說詳細(xì)的區(qū)別

概念上的區(qū)別:(內(nèi)容來自jdk,個人感覺這個描述信息,只能讓明白的人明白,不明白的人看起來還是有點難度(特別試中文版,英文版稍好些)所以在概念之后我會舉例說明。如果感覺看概念很累就跳過直接看例子吧。看完例子回來看概念會好些。

getPath
public String getPath()將此抽象路徑名轉(zhuǎn)換為一個路徑名字符串。所得到的字符串使用默認(rèn)名稱分隔符來分隔名稱序列中的名稱。

返回:
此抽象路徑名的字符串形式


getAbsolutePath
public String getAbsolutePath()返回抽象路徑名的絕對路徑名字符串。
如果此抽象路徑名已經(jīng)是絕對路徑名,則返回該路徑名字符串,這與 getPath() 方法一樣。如果此抽象路徑名是空的抽象路徑名,則返回當(dāng)前用戶目錄的路徑名字符串,該目錄由系統(tǒng)屬性 user.dir 指定。否則,使用與系統(tǒng)有關(guān)的方式分析此路徑名。在 UNIX 系統(tǒng)上,通過根據(jù)當(dāng)前用戶目錄分析某一相對路徑名,可使該路徑名成為絕對路徑名。在 Microsoft Windows 系統(tǒng)上,通過由路徑名指定的當(dāng)前驅(qū)動器目錄(如果有)來分析某一相對路徑名,可使該路徑名成為絕對路徑名;否則,可以根據(jù)當(dāng)前用戶目錄來分析它。


返回:
絕對路徑名字符串,它與此抽象路徑名表示相同的文件或目錄的
拋出:
SecurityException - 如果無法訪問所需的系統(tǒng)屬性值。
另請參見:
isAbsolute()


getCanonicalPath
public String getCanonicalPath()
                        throws IOException返回抽象路徑名的規(guī)范路徑名字符串。
規(guī)范路徑名是絕對路徑名,并且是惟一的。規(guī)范路徑名的準(zhǔn)確定義與系統(tǒng)有關(guān)。如有必要,此方法首先將路徑名轉(zhuǎn)換成絕對路徑名,這與調(diào)用 getAbsolutePath() 方法的效果一樣,然后用與系統(tǒng)相關(guān)的方式將它映射到其惟一路徑名。這通常涉及到從路徑名中移除多余的名稱(比如 "." 和 "..")、分析符號連接(對于 UNIX 平臺),以及將驅(qū)動器名轉(zhuǎn)換成標(biāo)準(zhǔn)大小寫形式(對于 Microsoft Windows 平臺)。

表示現(xiàn)有文件或目錄的每個路徑名都有一個惟一的規(guī)范形式。表示非存在文件或目錄的每個路徑名也有一個惟一的規(guī)范形式。非存在文件或目錄路徑名的規(guī)范形式可能不同于創(chuàng)建文件或目錄之后同一路徑名的規(guī)范形式。同樣,現(xiàn)有文件或目錄路徑名的規(guī)范形式可能不同于刪除文件或目錄之后同一路徑名的規(guī)范形式。


返回:
表示與此抽象路徑名相同的文件或目錄的規(guī)范路徑名字符串
拋出:
IOException - 如果發(fā)生 I/O 錯誤(可能是因為構(gòu)造規(guī)范路徑名需要進(jìn)行文件系統(tǒng)查詢)
SecurityException - 如果無法訪問所需的系統(tǒng)屬性值,或者存在安全管理器,且其 SecurityManager.checkRead(java.io.FileDescriptor) 方法拒絕對該文件進(jìn)行讀取訪問
從以下版本開始:
JDK1.1


二、例子:
1,getPath()與getAbsolutePath()的區(qū)別
Java代碼
  1. public static void test1(){   
  2.          File file1 = new File(".\\test1.txt");   
  3.          File file2 = new File("D:\\workspace\\test\\test1.txt");   
  4.          System.out.println("-----默認(rèn)相對路徑:取得路徑不同------");   
  5.          System.out.println(file1.getPath());   
  6.          System.out.println(file1.getAbsolutePath());   
  7.          System.out.println("-----默認(rèn)絕對路徑:取得路徑相同------");   
  8.          System.out.println(file2.getPath());   
  9.          System.out.println(file2.getAbsolutePath());   
  10.            
  11.      }  

得到的結(jié)果:
Java代碼
  1. -----默認(rèn)相對路徑:取得路徑不同------   
  2. .\test1.txt   
  3. D:\workspace\test\.\test1.txt   
  4. -----默認(rèn)絕對路徑:取得路徑相同------   
  5. D:\workspace\test\test1.txt   
  6. D:\workspace\test\test1.txt  

因為getPath()得到的是構(gòu)造file的時候的路徑。
getAbsolutePath()得到的是全路徑
如果構(gòu)造的時候就是全路徑那直接返回全路徑
如果構(gòu)造的時候試相對路徑,返回當(dāng)前目錄的路徑+構(gòu)造file時候的路徑


2,getAbsolutePath()和getCanonicalPath()的不同
Java代碼
  1. public static void test2() throws Exception{   
  2.          File file = new File("..\\src\\test1.txt");   
  3.          System.out.println(file.getAbsolutePath());   
  4.          System.out.println(file.getCanonicalPath());   
  5.      }  

得到的結(jié)果
Java代碼
  1. D:\workspace\test\..\src\test1.txt   
  2. D:\workspace\src\test1.txt  

可以看到CanonicalPath不但是全路徑,而且把..或者.這樣的符號解析出來。
3,getCanonicalPath()和自己的不同。
就是解釋這段話:
表示現(xiàn)有文件或目錄的每個路徑名都有一個惟一的規(guī)范形式。表示非存在文件或目錄的每個路徑名也有一個惟一的規(guī)范形式。非存在文件或目錄路徑名的規(guī)范形式可能不同于創(chuàng)建文件或目錄之后同一路徑名的規(guī)范形式。同樣,現(xiàn)有文件或目錄路徑名的規(guī)范形式可能不同于刪除文件或目錄之后同一路徑名的規(guī)范形式。

單下邊這段代碼是看不到結(jié)果的,要配合一定的操作來看。下邊操作步驟,同時講解

Java代碼
  1. public static void test3() throws Exception{   
  2.          File file = new File("D:\\Text.txt");   
  3.          System.out.println(file.getCanonicalPath());   
  4.      }  


步驟:
確定你的系統(tǒng)是Windows系統(tǒng)。
(1),確定D盤下沒有Text.txt這個文件,直接執(zhí)行這段代碼,得到的結(jié)果是:
D:\Text.txt注意這里試大寫的Text.txt
(2)在D盤下建立一個文件,名叫text.txt,再次執(zhí)行代碼,得到結(jié)果
D:\text.txt同樣的代碼得到不同的結(jié)果。
同時可以對比getAbsolutePath()看看,這個得到的結(jié)果是一樣的。

原因:
window是大小寫不敏感的,也就是說在windows上test.txt和Test.txt是一個文件,所以在windows上當(dāng)文件不存在時,得到的路徑就是按照輸入的路徑。但當(dāng)文件存在時,就會按照實際的情況來顯示。這也就是建立文件后和刪除文件后會有不同的原因。文件夾和文件類似。

三、最后:
1,嘗試在linux下執(zhí)行上邊的步驟,兩次打印的結(jié)果是相同的,因為linux是大小寫敏感的系統(tǒng)。
2,手動刪掉test.txt,然后嘗試執(zhí)行下邊代碼
Java代碼
  1. public static void test4() throws Exception{   
  2.          File file = new File("D:\\Text.txt");   
  3.          System.out.println(file.getCanonicalPath());   
  4.          File file1 = new File("D:\\text.txt");   
  5.          file1.createNewFile();   
  6.          file = new File("D:\\Text.txt");   
  7.          System.out.println(file.getCanonicalPath());   
  8.      }   
  9. public static void test3() throws Exception{   
  10.          File file1 = new File("D:\\text.txt");   
  11.          file1.createNewFile();   
  12.          File file = new File("D:\\Text.txt");   
  13.          System.out.println(file.getCanonicalPath());   
  14.      }  


執(zhí)行上邊兩個函數(shù),看看結(jié)果,然后思考一下為什么?
1,的結(jié)果是兩個大寫,
2,的結(jié)果試兩個小寫
連續(xù)兩個大寫的,是否跟上邊的矛盾 ?
這是因為虛擬機(jī)的緩存機(jī)制造成的。第一次File file = new File("D:\\Text.txt");決定了結(jié)果.

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多