Как избежать java.net.URISyntaxException в URL.toURI () - PullRequest
10 голосов
/ 21 декабря 2010

В конкретной программе мне передают file: URL, и мне нужно преобразовать его в URI объект. Использование метода toURI выдает java.net.URISyntaxException, если в URL есть пробелы или любые другие недопустимые символы.

Например:

URL url = Platform.getInstallURL();  // file:/Applications/Program
System.out.println(url.toURI());  // prints file:/Applications/Program

URL url = Platform.getConfigurationURL();  // file:/Users/Andrew Eisenberg
System.out.println(url.toURI());  // throws java.net.URISyntaxException because of the space

Каков наилучший способ выполнить это преобразование, чтобы обрабатывались все специальные символы?

Ответы [ 3 ]

7 голосов
/ 21 декабря 2010

Полагаю, лучшим способом было бы удалить устаревшую File.toURL(), которая обычно отвечает за создание этих неправильных URL.

Если вы не можете сделать это, может помочь что-то подобное:

public static URI fixFileURL(URL u) {
    if (!"file".equals(u.getProtocol())) throw new IllegalArgumentException();
    return new File(u.getFile()).toURI();
}
4 голосов
/ 04 февраля 2011

У меня была такая же проблема. На мой взгляд, лучшим решением является использование перегруженного конструктора для объекта URI и заполнение его получателями объекта URL. Таким образом, конструктор URI обрабатывает саму кодировку path-url и другие части (например, косые черты после протокола "http://") не будут затронуты.

uri = new URI(url.getProtocol(), url.getAuthority(), url.getHost(), url.getPort(), url.getPath(), url.getQuery(), url.getRef());

Поля, которые не должны быть установлены, могут быть заполнены нулем.

0 голосов
/ 21 декабря 2010

Это не проверено , но вы могли бы эффективно сделать это:

URL url = Platform.getConfigurationURL();  // file:/Users/Andrew Eisenberg
System.out.println(new URI(URLEncoder.encode(url.toString(), "UTF-8"))); 

В качестве альтернативы, вы можете сделать это:

System.out.println(new URI(url.toString().replace(" ", "%20")));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...