如何避免URL.toURI()中的java.net.URISyntaxException
在一个特定的程序中,我被传递了一个如何避免URL.toURI()中的java.net.URISyntaxException,java,url,uri,Java,Url,Uri,在一个特定的程序中,我被传递了一个文件:URL,我需要将它转换为URI对象。如果URL中有空格或任何其他无效字符,则使用toURI方法将抛出java.net.URISyntaxException 例如: URL url = Platform.getInstallURL(); // file:/Applications/Program System.out.println(url.toURI()); // prints file:/Applications/Program URL url =
文件:
URL,我需要将它转换为URI
对象。如果URL中有空格或任何其他无效字符,则使用toURI
方法将抛出java.net.URISyntaxException
例如:
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
执行此转换以处理所有特殊字符的最佳方式是什么?这是未经测试的但您可以有效地执行以下操作:
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")));
我想最好的办法是删除不推荐使用的
File.tour()
,它通常是产生这些错误URL的原因
如果你做不到,像这样的事情可能会有帮助:
public static URI fixFileURL(URL u) {
if (!"file".equals(u.getProtocol())) throw new IllegalArgumentException();
return new File(u.getFile()).toURI();
}
我也有同样的问题。在我看来,最好的解决方案是为URI对象使用重载构造函数,并用URL对象的getter填充它。通过这种方式,URI构造函数处理路径url编码本身和其他部分(如协议“http:/”)后面的斜杠)将不会被触及
uri = new URI(url.getProtocol(), url.getAuthority(), url.getHost(), url.getPort(), url.getPath(), url.getQuery(), url.getRef());
不应设置的字段可以用null填充。谢谢,但这不起作用,因为它想对所有内容进行编码。它将返回类似以下内容:“文件%3A%2FUsers%2FAndrew+Eisenberg”。我需要类似于:“文件:/Users/Andrew%20Eisenberg”(或空格的任何编码)。抱歉…按enter键太快:)的.replace()将无法工作,因为我需要处理当前操作系统上有效的任何路径,所以在Unix变体上,这将包括几乎所有ascii字符。这对我来说非常好。我尝试了几个变种,它是工作。在我接受之前,我只想再做一点测试。谢谢axtavt。这就是我现在使用的。它似乎可以处理各种奇怪的文件名,并且只对特殊字符进行编码,同时保留斜杠。警告:如果URL用转义空格URL表示“正确”(例如:“/C:/Program%20Files”),则不应使用此方法,因为它将返回原始的“C:/Program%20Files”文件。
URL.getAuthority()
在您的调用中应替换为url.getUserInfo()
,即,它应该是新URI(url.getProtocol(),url.getUserInfo(),url.getHost(),url.getPort(),url.getPath(),url.getQuery(),url.getRef())代码>。除此之外,据我所知,您的答案是正确的,谢谢:)更新:这不适用于mailto:username@example.com?subject=Topic
不起作用(生成java.net.URISyntaxException:绝对URI中的相对路径:mailto://username@example.com?subject=Topic
),因为URI.checkPath
方法,从构造函数调用,如果路径(username@example.com
)不为空。但是,newurl(“mailto:username@example.com?subject=Topic“).toURI()
在这种情况下有效。