Как избежать java.net.URISyntaxException в URL.toURI()

В конкретной программе я передал URL file:, и мне нужно преобразовать его в объект 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

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

Ответ 1

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

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

public static URI fixFileURL(URL u) {
    if (!"file".equals(u.getProtocol())) throw new IllegalArgumentException();
    return new File(u.getFile()).toURI();
}

Ответ 2

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

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

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

Ответ 3

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

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")));