2012-10-22 15 views
7

Mam wiele plików zasobów dołączonych do mojej aplikacji Java. Pliki te mają nazwy plików zawierające znaki międzynarodowe, takie jak ü lub æ. Chciałbym załadować te pliki za pomocą getClass(). GetResource(), ale najwyraźniej nie jest to obsługiwane, ponieważ dla tych konkretnych nazw plików metoda getResource zawsze zwraca wartość null.Najlepsza międzynarodowa alternatywa dla getClass(). GetResource()

To pozwoliło mi eksperymentować z używaniem kodowania adresów URL znaków międzynarodowych, ale nie jest to obsługiwane, zgodnie z informacjami podanymi przez http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4968789.

Moje pytanie brzmi: Jaki jest zalecany sposób ładowania zasobu, który ma nazwę zawierającą znaki międzynarodowe? Na przykład, muszę załadować UTF-8 zawartość pliku o nazwie Sjælland.txt

Odpowiedz

3

Nie wiem, czy jest tam best (prawdopodobnie jest to kandydat na worst ponieważ jest dość hack), ale wydaje się to sprawny mechanizm. Odsuwa to potrzebę użycia getResource, czytając bezpośrednio słoik.

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

    } 
} 

I dodaje plik o nazwie Sjælland.txt i to było z powodzeniem uzyskać wpis.

+0

To jest interesujące. Widziałem, dlaczego to zadziała. Jednak myślę, że zajmie trochę więcej pracy dla poprawnej wydajności, ponieważ otwierasz spakowany słoik za każdym razem, gdy czytasz plik. Przed zejściem z tej drogi sprawdzę, czy ktokolwiek inny ma inne możliwości. –

0

nie jestem pewien, że cię rozumiem poprawnie, ale gdy próbuję

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

następnie o jest sun.net.www.content.text.PlainTextInputStream.

Używam JDK 1.6 na komputerze z systemem Windows. Mam (domyślnie?) System.property sun.jnu.encoding ustawiony na Cp1252. Wydaje się więc, że wszystko działa dobrze. Wysłany błąd wygląda na JDK 1.4. To może być to, czego używasz.

+0

Nie, jestem w wersji Java: 1.7.0_10-ea, dostawca Java: Oracle Corporation na komputerze Mac. To dobrze działało z Javą 1.6.x firmy Apple. Rzucę okiem na kodowanie - może to jest to ... –

+0

Próbowałem użyć ustawienia sun.jnu.encoding w UTF-8, ponieważ ta strona mówi, że to właśnie używa mac: http://developer.apple. com/library/mac/# documentation/Java/Conceptual/Java14Development/04-JavaUIToolkits/JavaUIToolkits.html Próbowałem również użyć Normalizera do dekomponowania nazwy pliku, która jest niestandardowa w systemie plików Maca z tą linią: resourceUri = Normalizer.normalize (resourceUri, Normalizer.Form.NFD); Nadal nie działa. –

+0

Jeśli zajrzę do folderu i wypiszę jego pliki za pomocą Java.io, znajdę nazwę pliku: Sj lland.txt Wartości punktów kodowych to [83, 106, 65533, 65533, 108, 108, 97, 110, 100 , 46, 116, 120, 116] Tak więc "æ" jest jakoś przedstawiane jako dwa znaki. –

Powiązane problemy