file的getPath getAbsolutePath和getCanonicalPath的不同
file的這幾個取得path的方法各有不同,下邊說說詳細的區別
概念上的區別:(內容來自jdk,個人感覺這個描述信息,只能讓明白的人明白,不明白的人看起來還是有點難度(特別試中文版,英文版稍好些)所以在概念之后我會舉例說明。如果感覺看概念很累就跳過直接看例子吧。看完例子回來看概念會好些。
public?String?getPath()將此抽象路徑名轉換為一個路徑名字符串。所得到的字符串使用默認名稱分隔符來分隔名稱序列中的名稱。?
返回:
此抽象路徑名的字符串形式
?
getAbsolutePathpublic?String?getAbsolutePath()返回抽象路徑名的絕對路徑名字符串。?
如果此抽象路徑名已經是絕對路徑名,則返回該路徑名字符串,這與?getPath()?方法一樣。如果此抽象路徑名是空的抽象路徑名,則返回當前用戶目錄的路徑名字符串,該目錄由系統屬性?user.dir?指定。否則,使用與系統有關的方式分析此路徑名。在?UNIX?系統上,通過根據當前用戶目錄分析某一相對路徑名,可使該路徑名成為絕對路徑名。在?Microsoft?Windows?系統上,通過由路徑名指定的當前驅動器目錄(如果有)來分析某一相對路徑名,可使該路徑名成為絕對路徑名;否則,可以根據當前用戶目錄來分析它。?
返回:
絕對路徑名字符串,它與此抽象路徑名表示相同的文件或目錄的?
拋出:?
SecurityException?-?如果無法訪問所需的系統屬性值。
另請參見:
isAbsolute()
?
getCanonicalPathpublic?String?getCanonicalPath()
????????????????????????throws?IOException返回抽象路徑名的規范路徑名字符串。?
規范路徑名是絕對路徑名,并且是惟一的。規范路徑名的準確定義與系統有關。如有必要,此方法首先將路徑名轉換成絕對路徑名,這與調用?getAbsolutePath()?方法的效果一樣,然后用與系統相關的方式將它映射到其惟一路徑名。這通常涉及到從路徑名中移除多余的名稱(比如?"."?和?"..")、分析符號連接(對于?UNIX?平臺),以及將驅動器名轉換成標準大小寫形式(對于?Microsoft?Windows?平臺)。?
表示現有文件或目錄的每個路徑名都有一個惟一的規范形式。表示非存在文件或目錄的每個路徑名也有一個惟一的規范形式。非存在文件或目錄路徑名的規范形式可能不同于創建文件或目錄之后同一路徑名的規范形式。同樣,現有文件或目錄路徑名的規范形式可能不同于刪除文件或目錄之后同一路徑名的規范形式。?
返回:
表示與此抽象路徑名相同的文件或目錄的規范路徑名字符串?
拋出:?
IOException?-?如果發生?I/O?錯誤(可能是因為構造規范路徑名需要進行文件系統查詢)?
SecurityException?-?如果無法訪問所需的系統屬性值,或者存在安全管理器,且其?SecurityManager.checkRead(java.io.FileDescriptor)?方法拒絕對該文件進行讀取訪問
從以下版本開始:?
JDK1.1?
二、例子:
1,getPath()與getAbsolutePath()的區別
????????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()的不同
????????File?file?=?new?File("..\\src\\test1.txt");
????????System.out.println(file.getAbsolutePath());
????????System.out.println(file.getCanonicalPath());
????}
得到的結果
D:\workspace\test\..\src\test1.txtD:\workspace\src\test1.txt
可以看到CanonicalPath不但是全路徑,而且把..或者.這樣的符號解析出來。
3,getCanonicalPath()和自己的不同。
就是解釋這段話:
單下邊這段代碼是看不到結果的,要配合一定的操作來看。下邊操作步驟,同時講解
????????File?file?=?new?File("D:\\Text.txt");
????????System.out.println(file.getCanonicalPath());
????}
步驟:
確定你的系統是Windows系統。
(1),確定D盤下沒有Text.txt這個文件,直接執行這段代碼,得到的結果是:
注意這里試大寫的Text.txt
(2)在D盤下建立一個文件,名叫text.txt,再次執行代碼,得到結果
同樣的代碼得到不同的結果。
同時可以對比getAbsolutePath()看看,這個得到的結果是一樣的。
原因:
window是大小寫不敏感的,也就是說在windows上test.txt和Test.txt是一個文件,所以在windows上當文件不存在時,得到的路徑就是按照輸入的路徑。但當文件存在時,就會按照實際的情況來顯示。這也就是建立文件后和刪除文件后會有不同的原因。文件夾和文件類似。
三、最后:
1,嘗試在linux下執行上邊的步驟,兩次打印的結果是相同的,因為linux是大小寫敏感的系統。
2,手動刪掉test.txt,然后嘗試執行下邊代碼
????????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的不同的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux之循环执行任务
- 下一篇: 从Config文件中读取节点的配置信息