2012-01-10 2 views
6

У меня есть функция:Java - специальные URL-адрес символы

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

Он отлично работает, но если поместить мой файл .JAR на, например C: \ Ares !!! \ myfile.jar он терпит неудачу и я не вижу своих икон. Я заметил, что мой URL-адрес: файл:/C:/Ares !!!/myfile.jar! /com/test/images/img.png. Поэтому после расширения JAR есть ! символ! Я думаю, что это главная причина! Что я могу сделать, чтобы избежать этой проблемы? Благодарю.

+0

Вы должны использовать относительные пути вместо статических абсолютных путей. –

+0

Если вам это не сложно, вы могли бы объяснить мне, как это сделать? У меня есть стандартная ** функция ARMMain.class.getResource (путь) **, которая возвращает URL-адрес. – Nolesh

+2

Вместо использования 'C:/XYZ/...' используйте относительный путь как 'images/img.png'. –

ответ

5

Это, по-видимому, проблема (более чем ошибка) Java. URL JAR использует !/ в качестве разделителя, но не выходит из него, когда он появляется внутри пути к файлу.

Вы можете попытаться сбежать от него сами, поверните Ares!!!/ в Ares!!%21/, но держите myfile.jar!/ как есть.


Согласно RFC3986, ! является зарезервированным суб-разделитель символ. Поэтому безопасно использовать его для разделения разных частей в URL-адресе; когда он появляется внутри детали, он должен быть экранирован как %21

Однако код Java, имеющий дело с URL JAR, по-видимому, следует за более ранним RFC2396, в котором ! был незанятым. Для Java было неразумно выбирать unreserved char как разделитель. И когда это произошло, оно должно, по крайней мере, внутренне избежать его, как если бы символ был зарезервирован.

+0

Как я вижу, это большая проблема для всех пользователей и программистов ... Так что спасибо всем за обсуждение. Я собираюсь закрыть эту тему. – Nolesh

Смежные вопросы