Java7附带了本地文件的默认Path实现。 是否有网址的路径实施?
例如,我应该能够使用以下代码复制远程资源:
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
。我本可以自己实现,但我宁愿不重新发明轮子。
答案 0 :(得分:3)
看起来你真正要做的就是完成FTP的工作 - 将文件从一个地方复制到另一个地方。我建议你找到更好的方法来使用现有的FTP代码库。
URI不是文件系统路径,因此您不能将其视为文件系统路径。它们是地址/资源定位器,当您使用浏览器(或其他处理它们的客户端)时,它们会触发由其后面的服务器定义的某些操作。该服务器没有标准,因此Web服务的灵活性。因此,如果您的服务器正在以这种方式接受HTTP请求以便于文件复制,那么您将不得不自己滚动,并将文件数据传递给POST请求。
换句话说,(1)不要将URI视为文件系统路径 - 它们不是,(2)找到要复制文件的FTP库,和/或(3)如果你真的想要构建执行此操作的Web服务,通过POST请求抽象文件复制的详细信息。如果你做#3了解你的建筑非常接近自定义,并且它可能只适用于遵循你的特定设计的网站子集(即你自己构建的那些网站)。通过POST命令没有标准的参数集或“文件复制”我知道你可以利用它来“正常工作” - 你将不得不将你的HTTP请求与网络服务相匹配服务器端。
答案 1 :(得分:1)
您可以这样做:
URI uri = new URI("http://www.example.com/foo/bar.html");
try (InputStream is = uri.toURL().openStream()) {
// ...
}
开箱即用将适用于http
,https
和file
,可能还有更多。
对于相对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"
现在,您可以在toURL().openStream()
URI上调用absolute
。
答案 2 :(得分:-1)
我不得不处理类似的问题并写了一个小方法来解决这个问题,你可以在下面找到。
它可以很好地连接URL和相对后缀。由于URI解析函数的行为,请注意不要给出后缀绝对值。
private URI resolveURI(String root, String suffix) {
URI uri;
try {
uri = new URI(root + "/").resolve(suffix);
} catch (URISyntaxException e) {
//log
}
return uri;
}