2014-05-23 145 views
2

我有一個問題:在Java空白閱讀路徑 - 的FileInputStream錯誤

java.net.URISyntaxException:文件:在指數49路非法字符///選擇/存儲/用戶數據/附件/ 1_00100 \ 0042.jpg

文件的原始名稱是1_00100 0042.jpg

你能給我一些解決方案,怎樣用這種惡劣的道路這個文件?我知道C#有Path類。 Java中有類似的東西嗎?

我想未來,但沒有成功做到:

private String replaceWhitespace(String str) { 
     if (str.contains(" ")) { 
      str = str.replace(" ", "%20"); 
     } 
     return str; 
    } 
+0

在這裏你去: http://stackoverflow.com/questions/3487389/convert-string-to- uri – Dawnkeeper

+1

@Dawnkeeper標準Java(不是Android JDK)沒有'Uri',而是'URI'類,不幸的是它沒有'parse'方法。 – Pshemo

回答

1

使用文件,它的工作原理與空格:

String path = "file:///opt/storage/user-data/attachments/1_00100\\ 0042.jpg"; 
File f = new File(path); 

如果你想與%20來取代空格,則使用正則表達式:

path.replaceAll("\\u0020", "%20"); 
+0

這不符合你的想法。例如,檢查'f.getName()'用於用戶輸入'「file:/// opt/storage/user-data/attachments/1_00100 \\ 0042.jpg」'的結果。 – Pshemo

+0

我不明白你所暴露的問題,它有什麼問題? – Aboca

+0

你的代碼不會被編譯,因爲Java中的''''是特殊字符,需要額外的''''''作爲字面值,所以你需要把它寫成'「\\」'。關於'getName()'的結果會發生奇怪的事情,因爲在Java8中,只有'0042.jpg',而在Java7中我會看到'1_00100 \ 0042.jpg'(例如http://ideone.com/m2FsuT)。我不確定爲什麼會有這樣的差異。 – Pshemo

1

我不確定你是從哪裏得到這條路的,但我假設在\之前s步伐是爲了逃避它,所以你需要改變你的方法,以在空間之前也刪除這個\
此外,由於此方法不會影響您班級的實例狀態,因此您可以使其成爲static

private static String replaceWhitespace(String str) { 
    if (str.contains("\\ ")) { 
     str = str.replace("\\ ", "%20"); 
    } 
    return str; 
} 

演示:

String file = "file:///opt/storage/user-data/attachments/1_00100\\ 0042.jpg"; 
file = replaceWhitespace(file); 

URI u = new URI(file); 
System.out.println(u.getRawPath()); 
System.out.println(u.getPath()); 

輸出:

/opt/storage/user-data/attachments/1_00100%200042.jpg 
/opt/storage/user-data/attachments/1_00100 0042.jpg