1. 程式人生 > >File的getPath()和getAbsolutePath()和getCanonicalPath()的差別

File的getPath()和getAbsolutePath()和getCanonicalPath()的差別

不同 int rda 前驅 一個 throw one 可能 java.net

這幾個方法是有一次無意的發現,我當時也不知道什麽意思,就百度了,查到了一些列子:

原文地址http://www.blogjava.net/dreamstone/archive/2007/08/08/134968.html

一:介紹

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

返回:
技術分享此抽象路徑名的字符串形式



getAbsolutePath()

<pre name="code" class="java">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

二、樣例:
1。getPath()與getAbsolutePath()的差別

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());
        
    }
得到的結果:

-----默認相對路徑:取得路徑不同------
.\test1.txt
D:\workspace\test\.\test1.txt
-----默認絕對路徑:取得路徑同樣------
D:\workspace\test\test1.txt
D:\workspace\test\test1.txt
由於getPath()得到的是構造file的時候的路徑。
getAbsolutePath()得到的是全路徑
假設構造的時候就是全路徑那直接返回全路徑
假設構造的時候試相對路徑,返回當前文件夾的路徑+構造file時候的路徑

2,getAbsolutePath()和getCanonicalPath()的不同

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

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上當文件不存在時,得到的路徑就是依照輸入的路徑。

但當文件存在時,就會依照實際的情況來顯示。

這也就是建立文件後和刪除文件後會有不同的原因。目錄和文件類似。

三、最後:
1,嘗試在linux下運行上邊的步驟。兩次打印的結果是同樣的,由於linux是大寫和小寫敏感的系統。
2,手動刪掉test.txt,然後嘗試運行下邊代碼

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

運行上邊兩個函數,看看結果,然後思考一下為什麽?
1,的結果是兩個大寫。
2,的結果試兩個小寫
連續兩個大寫的,是否跟上邊的矛盾 ?
這是由於虛擬機的緩存機制造成的。第一次File file = new File("D:\\Text.txt");決定了結果.














File的getPath()和getAbsolutePath()和getCanonicalPath()的差別