2010-12-20 52 views
12

沒有人有經驗,或者知道什麼時候該方法File.getCanonicalPath()將拋出IOExceptionFile.getCanonicalPath()失敗的例子

我試圖從互聯網上查找和最好的答案是File API它說

IOException - 如果發生I/O錯誤,這是可能的,因爲規範路徑名的建設可能需要的文件系統查詢」

但是,因爲我仍然不認爲此力量的情況下,是不是很清楚,我失敗。任何人都可以給我具體的例子,可以發生在Linux,Windows和其他操作系統(可選)?

我之所以想知道是因爲我想要相應地處理這個異常。因此,如果我知道可能發生的所有可能的故障,那將是最好的。

回答

17

下面是一個Windows示例:

嘗試在您的CD驅動器文件調用getCanonicalFile,但沒有CD加載。例如:

new File("D:\\dummy.txt").getCanonicalFile(); 

您將獲得:

Exception in thread "main" java.io.IOException: The device is not ready 
    at java.io.WinNTFileSystem.canonicalize0(Native Method) 
    at java.io.Win32FileSystem.canonicalize(Win32FileSystem.java:396) 
    at java.io.File.getCanonicalPath(File.java:559) 
    at java.io.File.getCanonicalFile(File.java:583) 
+2

+1:很好的例子:) – LaGrandMere 2010-12-20 13:21:26

+0

這是否意味着如果文件不存在,這個方法將會失敗,或者它只會失敗的可移動驅動器?另外,@LaGrandMere說它已經在Java 1.5中修復了?那麼這個例子不再是這種情況了? – gigadot 2010-12-20 13:28:16

+0

@ gigadot:自己試一試,但我認爲它會提高IOExpcetion。我的例子是關於一個已修復的錯誤,但給出的例子應該總是拋出一個IOException,這就是爲什麼我把+1放在它上面:) – LaGrandMere 2010-12-20 13:32:58

3

Sun Bug Database在這裏看到。

對於JRE 1.4.2_06,當驅動器中沒有介質時,File.getCanonicalPath()不適用於Windows的可移動驅動器。

它已在Java 1.5中得到糾正,但您可以看到使用此方法可能存在基於操作系統的問題。

我不知道當前有什麼問題,但可能會發生,這正是Javadoc所說的。通常它會在最新的Java版本中快速修復。

6

如果我們嘗試使用Windows設備文件關鍵字(請參閱device files)創建文件對象作爲文件名,也會發生IO異常。
如果您嘗試將文件重命名爲這些關鍵字,Windows將不允許您創建它(不允許CON,PRN,COM1等文件名),但Java也無法將該文件名轉換爲正確的路徑。

因此,任何的下一個下一個代碼將特羅的IO異常:

File file = new File("COM1").getContextPath(); 
File file = new File("COM1.txt").getContextPath(); 
File file = new File("C:/somefolder/COM1.txt").getContextPath(); 

然而,接下來的代碼應工作:

File file = new File("COM1_.txt").getContextPath(); //underscore wins :) 
1

還有一個場景,當您嘗試使用操作系統的限制/無效的字符作爲您的文件名。

對於Windows \/: * ? " < > |這些是無效字符。嘗試使用以下命令重命名文件:您將收到有關無效字符的氣球/提示消息。

請嘗試以下Java代碼。

File file = new File("c:/outputlog-2013-09-20-22:15"); 
//A common scenario when you try to append java.util.Date to create a file like 
//File newFile = new File(filename + "_" + new Date()); 
System.out.println(file.getAbsolutePath()); 
System.out.println(file.getCanonicalPath()); 

如果文件名包含
* ?你會得到java.io.IOException異常:無效的參數
| :你會得到java.io.IOException異常:文件名,目錄名或卷標語法不正確


當您使用getCanonicalPath()方法。

如果我們使用任何" < > 字符的文件名,然後getCanonicalPath()方法是失敗,但是當您嘗試創建你會得到無效參數異常的文件。

參見jdk7 api

規範形式的精確定義是依賴於系統的。在這裏,我已經使用Windows 7的

2

這裏是所有的操作系​​統一般示例:

new File("\u0000").getCanonicalFile(); 

文件之前進行規範化,檢查其有效性與的java.io.File#isInvalid:

final boolean isInvalid() { 
    if (status == null) { 
     status = (this.path.indexOf('\u0000') < 0) ? PathStatus.CHECKED 
                : PathStatus.INVALID; 
    } 
    return status == PathStatus.INVALID; 
} 

如果該文件是無效的 - 你會得到一個IO異常:

public String getCanonicalPath() throws IOException { 
    if (isInvalid()) { 
     throw new IOException("Invalid file path"); 
    } 
    return fs.canonicalize(fs.resolve(this)); 
} 

利潤!