2012-10-22 28 views
7

我有很多資源文件與我的Java應用程序捆綁在一起。這些文件具有包含國際字符(如ü或æ)的文件名。我想使用getClass()。getResource()加載這些文件,但顯然這不被支持,因爲對於這些特定的文件名,getResource方法總是返回null。Java的getClass()的最佳國際替代品getResource()

這讓我嘗試使用國際字符的URL編碼,但這不支持,如http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4968789所述。

所以,我的問題是:什麼是加載一個名稱包含國際字符的資源推薦的方式?例如,我需要的,如果有一個best(它可能是爲worst的候選者,因爲它是一個相當黑客)加載一個名爲Sjælland.txt

回答

3

不知道文件的UTF-8的內容,但這似乎是一個能力的機制。它通過直接閱讀jar來回避使用getResource的需要。

public class NavelGazing { 
    public static void main(String[] args) throws Throwable { 
    // Do a little navel gazing. 
    java.net.URL codeBase = NavelGazing.class.getProtectionDomain().getCodeSource().getLocation(); 
    // Must be a jar. 
    if (codeBase.getPath().endsWith(".jar")) { 
     // Open it. 
     java.util.jar.JarInputStream jin = new java.util.jar.JarInputStream(codeBase.openStream()); 
     // Walk the entries. 
     ZipEntry entry; 
     while ((entry = jin.getNextEntry()) != null) { 
     System.out.println("Entry: "+entry.getName()); 
     } 
    } 

    } 
} 

我添加了一個名爲Sjælland.txt的文件,並且這個文件成功地獲得了條目。

+0

這很有趣。我可以看到爲什麼這會起作用。不過,我認爲需要做更多的工作才能獲得正確的性能,因爲每次讀取文件時都會打開一個壓縮的jar。在走下這條路之前,我會看看是否有其他人可以分享其他選擇。 –

0

我不知道我理解你正確,但如果我嘗試

URL url = Test.class.getResource("/Sjælland.txt"); 
Object o = url.getContent(); 

然後osun.net.www.content.text.PlainTextInputStream。我在Windows機器上使用JDK 1.6。我有(默認?)System.property sun.jnu.encoding設置爲Cp1252。所以這一切似乎都很好。您發佈的錯誤似乎是JDK 1.4。這可能是你正在使用的。

+0

不,我在Java版本:1.7.0_10-ea,Java供應商:在Mac上的Oracle Corporation。這用於在Apple的Java 1.6.x上正常工作。我會看看編碼 - 也許就是這樣... –

+0

我嘗試使用UTF-8的sun.jnu.encoding設置,因爲此頁說這是mac使用的: http://developer.apple。我也嘗試使用Normalizer來分解文件名,就像在Mac文件系統中使用此行自定義一樣: resourceUri = Normalizer.normalize(resourceUri,Normalizer.Form.NFD); 不過,它不起作用。 –

+0

如果我查找文件夾並使用Java.io列出它的文件,我發現文件名爲 Sj lland.txt 代碼點值是[83,106,65533,65533,108,108,97,110,100 ,46,116,120,116] 所以'æ'以某種方式表示爲兩個字符。 –

相關問題