2012-09-10 42 views
2

我正在與java.io.File一起處理外部存儲器上的某些PDF文件。我正在加載它們,並注意到我的日誌中有一些File NotFoundExceptions。我正在尋找異常,並注意到一個奇怪的標誌(?內部= )UNCJava - 在UNC中找不到ö或ü的文件

這就是我如何製作我的文件。如果這有所幫助,我可以從緩衝讀取器中獲取字符串。

File myPathFile 
    FileReader fr = new FileReader(myPathFile); 
    BufferedReader br = new BufferedReader(fr) 
    String o = br.readLine(); 
    File f = new File(o) 

我還以爲是一樣的:

 File f = new File("\\test\ö\myFile.pdf"); //When the UNC looks like this it won't work. (the ö is �) 
    File f2 = new File("\\test\myFile.pdf"); //This works 
+3

你確定這是你的代碼嗎?它甚至不應該編譯...'\ m'不是有效的轉義。請參閱http://docs.oracle.com/javase/specs/jls/se7/html/jls-3.html#jls-3.10。6 –

+0

這不是一個URL,即UNC。 –

回答

2

首先,它不是一個URL,它是一個UNC。

然後,它不是一個正確的UNC,因爲你忘記了一些非常重要的部分。

\\ComputerName\SharedFolder\Resource 

當分組是

[\\] flag to suggest it's a UNC 
[ComputerName] The name of the remote computer 
[\] separator character 
[SharedFolder] The shared folder name 
[\Resource] The path name of the remote file 

最後,你是不是正確的字符串中的轉義的特殊字符,所以你可能甚至沒有下車你的機器,更別說讓到你想。

要鍵入Java中的\,你需要知道\用於特殊字符,如空,退格等,因此,要獲得一個單一的,正常的\必須鍵入\\。這將成爲你的第一個例子。

在非微軟系統,請記住,遠程路徑名稱可能使用/,而不是\,那/不是一個轉義字符,所以沒有必要輸入兩次。

File f = new File("\\\\test\\ö\\myFile.pdf"); 

這將無法工作,因爲你沒有命名的共享文件夾ö

和你的第二個例子

File f2 = new File("\\\\test\\myFile.pdf"); 

你的第二個例子是行不通的,因爲它缺乏一個資源被打開。

假設您不想離開您的機器,您缺少本地文件名的部分。在Windows上,完整路徑包括「卷名稱」,通常是C:或類似的東西。

File f = new File("c:\\test\\myFile.pdf"); 

有時候人們會忽略卷名,在這種情況下,您會依賴操作系統的好感來嘗試爲您找到文件。一般來說,這不是一個好主意。

File f = new File("\\test\\myFile.pdf"); 

但即使這看起來與您的第二個示例類似,它包含一個額外的正斜槓來轉義正斜槓。雖然你的實際例子沒有。

+0

其他一些組合可能會起作用,但僅僅是因爲您的操作系統試圖「幫助您」。它們不是有效的名稱,但Microsoft Windows的歷史記錄包含_sometimes_,允許您執行無效的操作,因爲允許無效的操作被視爲Microsoft歷史上可用性的關鍵點。 –

+0

對於100000個其他文件,它工作正常,所以我不知道我必須改變它。我認爲文件共享來自unix服務器。 unc似乎是這樣混合的:\\ test \ myFolder/myfile.pdf – DavidVdd

+0

我更新了答案以更好地涵蓋多平臺問題。感謝指針。 –

相關問題