File類的getPath、getAbsolutePath和getCanonicalPath的不一樣

1、概念上的不一樣

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

---------------------------------------------------------java

getAbsolutePath
public String getAbsolutePath()
返回此抽象路徑名的絕對路徑名字符串。
若是此抽象路徑名已是絕對路徑名,則返回該路徑名字符串,這與 getPath() 方法同樣。若是此抽象路徑名是空抽象路徑名,則返回當前用戶目錄的路徑名字符串,該目錄由系統屬性 user.dir 指定。不然,使用與系統有關的方式解析此路徑名。在 UNIX 系統上,根據當前用戶目錄解析相對路徑名,可以使該路徑名成爲絕對路徑名。在 Microsoft Windows 系統上,根據路徑名指定的當前驅動器目錄(若是有)解析相對路徑名,可以使該路徑名成爲絕對路徑名;不然,能夠根據當前用戶目錄解析它。
返回:
絕對路徑名字符串,它與此抽象路徑名錶示相同的文件或目錄
拋出:
SecurityException - 若是沒法訪問所需的系統屬性值。
另請參見:
isAbsolute()

---------------------------------------------------------linux

getCanonicalPath
public String getCanonicalPath()
                        throws IOException
返回此抽象路徑名的規範路徑名字符串。
規範路徑名是絕對路徑名,而且是唯一的。規範路徑名的準肯定義與系統有關。若有必要,此方法首先將路徑名轉換爲絕對路徑名,這與調用 getAbsolutePath() 方法的效果同樣,而後用與系統相關的方式將它映射到其唯一路徑名。這一般涉及到從路徑名中移除多餘的名稱(好比 "." 和 "..")、解析符號鏈接(對於 UNIX 平臺),以及將驅動器號轉換爲標準大小寫形式(對於 Microsoft Windows 平臺)。
每一個表示現存文件或目錄的路徑名都有一個唯一的規範形式。每一個表示不存在文件或目錄的路徑名也有一個唯一的規範形式。不存在文件或目錄路徑名的規範形式可能不一樣於建立文件或目錄以後同一路徑名的規範形式。一樣,現存文件或目錄路徑名的規範形式可能不一樣於刪除文件或目錄以後同一路徑名的規範形式。
返回:
規範路徑名字符串,它與此抽象路徑名錶示相同的文件或目錄
拋出:
IOException - 若是發生 I/O 錯誤(多是由於構造規範路徑名須要進行文件系統查詢)
SecurityException - 若是沒法訪問所需的系統屬性值,或者存在安全管理器,且其SecurityManager.checkRead(java.io.FileDescriptor) 方法拒絕對文件進行讀訪問
從如下版本開始:
JDK1.1

2、實例解析

1.getPath()getAbsolutePath()的區別

public void diff_pathAndAbsolutePath(){
    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());
}

獲得的結果:windows

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

結論:
安全

getPath獲得的是構造參數的路徑。spa

getAbsolutePath獲得的是全路徑。若是構造參數是相對路徑,則返回當前目錄的絕對路徑+構造參數路徑;若是是絕對路徑則直接返回。code

2.getAbsolutePath()getCanonicalPath()的區別

public void diff_AbsolutePathAndCanonicalPath() throws IOException{
    File file = new File("..\\src\\test1.txt");
    System.out.println(file.getAbsolutePath());
    System.out.println(file.getCanonicalPath());
}

獲得的結果:ip

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

結論:
字符串

getCanonicalPath獲得的不只是全路徑,並且會解析並剔除[..]這樣的符號,即給出一個標準的絕對路徑。get

3.getCanonicalPath()自身的區別

就是解釋這段話:it

每一個表示現存文件或目錄的路徑名都有一個唯一的規範形式。每一個表示不存在文件或目錄的路徑名也有一個唯一的規範形式。不存在文件或目錄路徑名的規範形式可能不一樣於建立文件或目錄以後同一路徑名的規範形式。一樣,現存文件或目錄路徑名的規範形式可能不一樣於刪除文件或目錄以後同一路徑名的規範形式。
public void diff_canonicalPathAndSelf() throws IOException{
    File file = new File("D:\\Text.txt");
    System.out.println(file.getCanonicalPath());
}

操做步驟:

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

D:\Text.txt

(2)在D盤下創建一個文件,名叫text.txt,再次執行代碼,獲得結果是:

D:\text.txt

(3)在linux系統中按以上步驟運行代碼。獲得的結果是:

兩次結果同樣。

結論:

window是大小寫不敏感的,也就是說在windows上test.txt和Test.txt是一個文件,因此在windows上當文件不存在時,獲得的路徑就是按照輸入的路徑。但當文件存在時,就會按照實際的狀況來顯示。這也就是創建文件後和刪除文件後會有不一樣的緣由。文件夾和文件相似。而在linux系統中,大小寫是敏感的。

相關文章
相關標籤/搜索