Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何避免URL.toURI()中的java.net.URISyntaxException_Java_Url_Uri - Fatal编程技术网

如何避免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()
在这种情况下有效。