java.nio.file.Path for URL?

2022-09-01 09:05:32

Java7 附带了本地文件的缺省路径实现。是否有 URL 的路径实现?

例如,我应该能够使用以下代码复制远程资源:

Path remote = Paths.get(new URI("http://www.example.com/foo/bar.html"));
Path local = Paths.get(new URI("/bar.html"));
Files.copy(remote, local);

目前,这会抛出 .我可能可以自己实现这一点,但我宁愿不重新发明轮子。java.nio.file.FileSystemNotFoundException: Provider "http" not installed


答案 1

似乎您真正想要做的是完成FTP所做的 - 将文件从一个地方复制到另一个地方。我建议您找到更好的方法来使用现有的FTP代码库来做到这一点。

URI 不是文件系统路径,因此不能将其视为文件系统路径。它们是地址/资源定位器,当您使用浏览器(或处理它们的其他客户端)访问该地址/资源定位器时,它们会触发由其后面的服务器定义的某些操作。该服务器的功能没有标准,因此Web服务的灵活性。因此,如果您的服务器以这种方式接受HTTP请求以方便文件复制,则必须滚动自己的请求,并将文件数据传递到POST请求中。

换句话说,(1)不要把URI当作文件系统路径来对待-它们不是,(2)找到一个FTP库来复制文件,和/或(3)如果你真的想构建一个这样做的Web服务,通过POST请求抽象出文件复制的细节。如果你做了#3,了解你的建筑非常接近自定义,并且它可能只适用于遵循你的特定设计的网站的子集(即你自己构建的网站)。据我所知,没有通过POST命令进行的标准参数集或“文件复制”,您可以利用它来使此“正常工作” - 您将不得不将HTTP请求与服务器端的Web服务相匹配。


答案 2

您可以执行以下操作:

URI uri = new URI("http://www.example.com/foo/bar.html");
try (InputStream is = uri.toURL().openStream()) {
    // ...
}

它将适用于 ,并且开箱即用,可能还有更多。httphttpsfile

对于相对 URI,您必须首先解决它们:

URI relative = new URI("bar.html");
URI base = new URI("http://www.example.com/foo/");
URI absolute = base.resolve(relative);
System.out.println(absolute); // prints "http://www.example.com/foo/bar.html"

现在,您可以调用 URI。toURL().openStream()absolute


推荐