Как избежать 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")));