2012-01-10 16 views
6

Mam funkcję:Java - specjalne adresy URL znaków

public static ImageIcon GetIconImageFromResource(String path){ 
    URL url = ARMMain.class.getResource(path); 
return new ImageIcon(url); 
} 

Działa świetnie, ale jeśli umieścić mój plik .JAR na przykład C: \ Ares !!! \ myfile.jar zawiedzie i nie widzę moich ikon. Zauważyłem, że mój adres URL to plik:/C:/Ares !!!/myfile.jar! /com/test/images/img.png. Więc po rozszerzeniu JAR jest ! symbol! Myślę, że to jest główny powód! Co mogę zrobić, aby uniknąć tego problemu? Dzięki.

+0

Powinieneś używać względnych ścieżek zamiast statycznych bezwzględnych ścieżek. –

+0

Jeśli nie jest ci trudno, możesz mi wyjaśnić, jak? Mam standardową funkcję ** ARMMain.class.getResource (path) **, która zwraca adres URL. – Nolesh

+2

Zamiast używać 'C:/XYZ/...' użyj względnej ścieżki jako 'images/img.png'. –

Odpowiedz

5

To najwyraźniej problem (więcej niż błąd) Javy. Adres URL JAR używa !/ jako ogranicznika, ale nie usuwa go, gdy pojawia się wewnątrz ścieżki do pliku.

Możesz spróbować uciec samemu, zmień Ares!!!/ w Ares!!%21/, ale zachowaj myfile.jar!/, jak jest.


Według RFC3986, ! jest zarezerwowanym sub-ogranicznik char. Dlatego można bezpiecznie używać go do oddzielania różnych części w adresie URL; gdy pojawia się wewnątrz części, musi być uniknięty jako kod Java obsługujący adres URL JAR, widocznie podążając za starszym RFC2396, w którym ! był niezarezerwowanym znakiem char. Nierozsądne było, aby Java wybrała niezarezerwowany znak jako separator. A kiedy to zrobi, powinien przynajmniej wewnętrznie uciec, tak jakby char był zarezerwowany.

+0

Jak widzę Jest to duży problem dla wszystkich użytkowników i programistów ... Dziękuję wam wszystkim za dyskusję. Zamierzam zamknąć ten wątek. – Nolesh