Java File類之getPath | getAbsolutePath | getCanonicalPath

一. API

以下是3個方法的api說明。

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

 

二. 代碼示例

在實際編程中,我最常用到的就是getAbsolutePath方法,getCanonicalPath方法則比較陌生,對這三個方法直觀淺顯的理解就是:

getPath獲取文件相對路徑,用什麼樣的String構造的File對象,其getPath方法就返回什麼樣的String,當然,返回的String會矯正構造String中的文件分隔符錯誤,如重複的分隔符,其他操作系統平臺的分隔符。

getAboulutePath獲取文件的絕對路徑,即獲取的文件路徑是從根目錄開始的。

getCanonicalPath獲取文件的規範路徑,獲取的文件路徑不僅是從根目錄開始的,而且還是規範的,會矯正文件路徑中的大小寫問題,會處理並移除文件路徑中的定位符號(比如 "." 和 "..")。

 

我面臨的問題就是,一個文件監控器,用來監控指定目錄下文件的增、刪、改情況。當對文件名進行大小寫的修改時,監控器的識別會有問題。

由於Windows系統中文件名的大小寫是無關緊要的,因此當修改文件名的大小寫時,文件監控器雖然監聽到了事件,但對事件進行驗證時,發現文件還是那個文件,會認爲文件沒有發生任何變化,從而導致該事件會被忽略掉。

怎麼辦呢,只能啓用getCanonicalPath方法,利用該方法糾正文件路徑中的大小寫問題,再進行後續的文件校驗。

	public static void main(String[] args)
	{
		File file = new File("a\\b/c/d/../readME.txt");
		System.out.println("path: " + file.getPath());
		System.out.println("absolutePath: " + file.getAbsolutePath());
		
		try
		{
			System.out.println("canonicalPath: " + file.getCanonicalPath());
		}
		catch(IOException e)
		{
			e.printStackTrace();
		}
	}

測試程序中,真實的文件名稱爲readme.txt,構造時傳入的文件名稱爲readME.txt,使用相對路徑,並使用了路徑回退符號“..”。

 

代碼輸出結果:

path: a\b\c\d\..\readME.txt

absolutePath: D:\workspace\svn\zhangdan\TMD\a\b\c\d\..\readME.txt

canonicalPath: D:\workspace\svn\zhangdan\TMD\a\b\c\readme.txt

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章