2012-10-22 20 views
7

Ho molti file di risorse in bundle con la mia app Java. Questi file hanno nomi di file contenenti caratteri internazionali come ü o æ. Vorrei caricare questi file usando getClass(). GetResource(), ma a quanto pare questo non è supportato poiché per questi particolari nomi di file, il metodo getResource restituisce sempre null.Migliore alternativa internazionale a getClass di Java(). GetResource()

Questo mi ha fatto sperimentare l'utilizzo della codifica URL dei caratteri internazionali, ma questo non è supportato come indicato da http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4968789.

Quindi, la mia domanda è: qual è il modo consigliato di caricare una risorsa che ha un nome contenente caratteri internazionali? Per esempio, ho bisogno di caricare il contenuto UTF-8 di un file di nome Sjælland.txt

risposta

3

Non so se c'è un best (probabilmente è un candidato per worst perché è piuttosto un hack), ma questo mi sembra un meccanismo capace. Evita la necessità di utilizzare getResource leggendo direttamente il jar.

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()); 
     } 
    } 

    } 
} 

ho aggiunto un file chiamato Sjælland.txt e questo hanno ottenuto con successo la voce.

+0

Ciò è interessante. Potevo capire perché avrebbe funzionato. Tuttavia, penso che ci vorrebbe un po 'più di lavoro per prestazioni adeguate, dal momento che si sta aprendo un barattolo zippato ogni volta che si legge un file. Prima di percorrere questa strada, vedrò se qualcun altro ha altre alternative da condividere. –

0

Non sono sicuro che ho capito bene, ma se provo

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

poi o è un sun.net.www.content.text.PlainTextInputStream.

Sto usando JDK 1.6 su un computer Windows. Ho (predefinito?) System.property sun.jnu.encoding impostato su Cp1252. Quindi tutto sembra funzionare bene. Il bug che hai postato sembra essere JDK 1.4. Potrebbe essere quello che stai usando.

+0

No, sono in versione Java: 1.7.0_10-ea, fornitore Java: Oracle Corporation su un Mac. Questo funzionava benissimo con Java 1.6.x di Apple. Daremo un'occhiata alla codifica - forse è proprio così ... –

+0

Ho provato a utilizzare l'impostazione sun.jnu.encoding di UTF-8, poiché questa pagina dice che è ciò che il mac usa: http://developer.apple. com/library/mac/# documentation/Java/Conceptual/Java14Development/04-JavaUIToolkits/JavaUIToolkits.html Ho anche provato a utilizzare il normalizzatore per decomporre il nome del file come è normale nel file system Mac con questa riga: resourceUri = Normalizer.normalize (resourceUri, Normalizer.Form.NFD); Ancora, non funziona. –

+0

Se cerco la cartella ed elenco i suoi file utilizzando Java.io, trovo un nome file di Sj lland.txt I valori del punto di codice sono [83, 106, 65533, 65533, 108, 108, 97, 110, 100 , 46, 116, 120, 116] Quindi "æ" è rappresentato in qualche modo da due caratteri. –

Problemi correlati