File的getPath getAbsolutePath和getCanonicalPath的不同
file的這幾個取得path的方法各有不同,下邊說說詳細的區別
概念上的區別:(內容來自jdk,個人感覺這個描述資訊,只能讓明白的人明白,不明白的人看起來還是有點難度(特別試中文版,英文版稍好些)所以在概念之後我會舉例說明。如果感覺看概念很累就跳過直接看例子吧。看完例子回來看概念會好些。
getPath
public String getPath()將此抽象路徑名轉換為一個路徑名字串。所得到的字串使用預設名稱分隔符來分隔名稱序列中的名稱。
返回:
此抽象路徑名的字串形式
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
二、例子:
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");決定了結果.
轉自:http://harbey.iteye.com/blog/489406
相關文章
- File getPath()、getAbsolutePath()、getCanonical
- ASM file和file alias之間的對映關係!ASM
- 湖泊和河流的成因有何不同?湖泊和水庫又有何不同?
- 電話機器人在不同的行業有不同的應用場景和不同的效果機器人行業
- redo的等待log file sync和log file parallel write和redo size設定Parallel
- vue和react的相同點和不同點VueReact
- C++ 和java的不同點C++Java
- iOS 開發 frame和Bounds的不同iOS
- log file sync 和 log file parallel writeParallel
- 生動講解使用不同方式操作File檔案的方法之間的差異
- Go和Java的interface有什麼不同GoJava
- Html5和Html4的不同HTML
- Java中的HashMap和HashTable到底哪不同?JavaHashMap
- $().click () 和 $(document).on ('click','要選擇的元素',function (){}) 的不同Function
- 關於aix的maxperm,minperm和lru_file_repageAI
- Flutter之支援不同的螢幕尺寸和方向Flutter
- 和 koa 不同的 express 是怎麼實現Express
- python中,"_"和"__"的作用有什麼不同?Python
- 三,TreeMap和HashMap,TreeSet和HashMap的區別以及方法使用上的不同HashMap
- File類的使用
- 等待事件db file sequential read、db file scattered read和direct read的區別事件
- 不同瀏覽器下 autoplay 的限制策略和方案的整理瀏覽器
- 我理解的IPTV盒子和OTT盒子的幾個不同點
- include "head_file" 和 include <head_file>
- 不同層級的Android開發者的不同行為Android
- 不同的斷點,不同的效果!!! (9千字)斷點
- 不同size class顯示不同的UIUI
- git 不同目錄用不同的配置Git
- file_get_contents和fread的效能差別
- python2和python3的不同Python
- Android Studio和eclipse之間的不同AndroidEclipse
- HTTP和SOAP完全就是兩個不同的協議HTTP協議
- data file int write和db file sequential read個人想法
- aix不同版本安裝oracle的不同版本時的要求AIOracle
- 為不同專案指定不同的 PHP 版本PHP
- wordpress 不同的人看到不同的媒體庫
- 不同業務場景使用不同的map
- 不同網站檢測到的ip不同網站