file的getPath getAbsolutePath和getCanonicalPath的不一樣

file的這幾個取得path的方法各有不一樣,下邊說說詳細的區別

概念上的區別:(內容來自jdk,我的感受這個描述信息,只能讓明白的人明白,不明白的人看起來仍是有點難度(特別試中文版,英文版稍好些)因此在概念以後我會舉例說明。若是感受看概念很累就跳過直接看例子吧。看完例子回來看概念會好些。
java

getPath
public String getPath()將此抽象路徑名轉換爲一個路徑名字符串。所獲得的字符串使用默認名稱分隔符來分隔名稱序列中的名稱。

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


getAbsolutePath
public String getAbsolutePath()返回抽象路徑名的絕對路徑名字符串。
若是此抽象路徑名已是絕對路徑名,則返回該路徑名字符串,這與 getPath() 方法同樣。若是此抽象路徑名是空的抽象路徑名,則返回當前用戶目錄的路徑名字符串,該目錄由系統屬性 user.dir 指定。不然,使用與系統有關的方式分析此路徑名。在 UNIX 系統上,經過根據當前用戶目錄分析某一相對路徑名,可以使該路徑名成爲絕對路徑名。在 Microsoft Windows 系統上,經過由路徑名指定的當前驅動器目錄(若是有)來分析某一相對路徑名,可以使該路徑名成爲絕對路徑名;不然,能夠根據當前用戶目錄來分析它。


返回:
絕對路徑名字符串,它與此抽象路徑名錶示相同的文件或目錄的
拋出:
SecurityException
- 若是沒法訪問所需的系統屬性值。
另請參見:
isAbsolute()
安全


getCanonicalPath
public String getCanonicalPath()
                       
throws IOException返回抽象路徑名的規範路徑名字符串。
規範路徑名是絕對路徑名,而且是唯一的。規範路徑名的準肯定義與系統有關。若有必要,此方法首先將路徑名轉換成絕對路徑名,這與調用 getAbsolutePath() 方法的效果同樣,而後用與系統相關的方式將它映射到其唯一路徑名。這一般涉及到從路徑名中移除多餘的名稱(好比
".""..")、分析符號鏈接(對於 UNIX 平臺),以及將驅動器名轉換成標準大小寫形式(對於 Microsoft Windows 平臺)。

表示現有文件或目錄的每一個路徑名都有一個唯一的規範形式。表示非存在文件或目錄的每一個路徑名也有一個唯一的規範形式。非存在文件或目錄路徑名的規範形式可能不一樣於建立文件或目錄以後同一路徑名的規範形式。一樣,現有文件或目錄路徑名的規範形式可能不一樣於刪除文件或目錄以後同一路徑名的規範形式。


返回:
表示與此抽象路徑名相同的文件或目錄的規範路徑名字符串
拋出:
IOException
- 若是發生 I/O 錯誤(多是由於構造規範路徑名須要進行文件系統查詢)
SecurityException
- 若是沒法訪問所需的系統屬性值,或者存在安全管理器,且其 SecurityManager.checkRead(java.io.FileDescriptor) 方法拒絕對該文件進行讀取訪問
從如下版本開始:
JDK1.
1
spa


2、例子:
1,getPath()與getAbsolutePath()的區別
.net

public static void test1(){
       File file1
= new File(".\\test1.txt");
       File file2
= new File("D:\\workspace\\test\\test1.txt");
       System.out.println(
"-----默認相對路徑:取得路徑不一樣------");
       System.out.println(file1.getPath());
       System.out.println(file1.getAbsolutePath());
       System.out.println(
"-----默認絕對路徑:取得路徑相同------");
       System.out.println(file2.getPath());
       System.out.println(file2.getAbsolutePath());
       
   }
blog


獲得的結果:
ip

-----默認相對路徑:取得路徑不一樣------
.\test1.txt
D:\workspace\test\.\test1.txt
-----默認絕對路徑:取得路徑相同------
D:\workspace\test\test1.txt
D:\workspace\test\test1.txt
字符串

由於getPath()獲得的是構造file的時候的路徑。
getAbsolutePath()獲得的是全路徑
若是構造的時候就是全路徑那直接返回全路徑
若是構造的時候試相對路徑,返回當前目錄的路徑+構造file時候的路徑

2,getAbsolutePath()和getCanonicalPath()的不一樣
get

public static void test2() throws Exception{
       File file
= new File("..\\src\\test1.txt");
       System.out.println(file.getAbsolutePath());
       System.out.println(file.getCanonicalPath());
   }
it

獲得的結果

D:\workspace\test\..\src\test1.txt
D:\workspace\src\test1.txt

能夠看到CanonicalPath不可是全路徑,並且把..或者.這樣的符號解析出來。
3,getCanonicalPath()和本身的不一樣。
就是解釋這段話:

表示現有文件或目錄的每一個路徑名都有一個唯一的規範形式。表示非存在文件或目錄的每一個路徑名也有一個唯一的規範形式。非存在文件或目錄路徑名的規範形式可能不一樣於建立文件或目錄以後同一路徑名的規範形式。一樣,現有文件或目錄路徑名的規範形式可能不一樣於刪除文件或目錄以後同一路徑名的規範形式。

單下邊這段代碼是看不到結果的,要配合必定的操做來看。下邊操做步驟,同時講解

public static void test3() throws Exception{
       File file
= new File("D:\\Text.txt");
       System.out.println(file.getCanonicalPath());
   }

步驟:
肯定你的系統是Windows系統。
(1),肯定D盤下沒有Text.txt這個文件,直接執行這段代碼,獲得的結果是:

D:\Text.txt

注意這裏試大寫的Text.txt
(2)在D盤下創建一個文件,名叫text.txt,再次執行代碼,獲得結果

D:\text.txt

一樣的代碼獲得不一樣的結果。同時能夠對比getAbsolutePath()看看,這個獲得的結果是同樣的。緣由:window是大小寫不敏感的,也就是說在windows上test.txt和Test.txt是一個文件,因此在windows上當文件不存在時,獲得的路徑就是按照輸入的路徑。但當文件存在時,就會按照實際的狀況來顯示。這也就是創建文件後和刪除文件後會有不一樣的緣由。文件夾和文件相似。

相關文章
相關標籤/搜索