[英]java.nio.file.Path for URLs?
Java7 附帶了本地文件的默認Path實現。 是否有 URL 的 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
。 我可能自己實現這個,但我不想重新發明輪子。
看起來您真正想做的是完成 FTP 所做的事情 - 將文件從一個地方復制到另一個地方。 我建議您使用現有的 FTP 代碼庫找到更好的方法來做到這一點。
URI 不是文件系統路徑,因此您不能將它們視為文件系統路徑。 它們是地址/資源定位器,當您使用瀏覽器(或處理它們的另一個客戶端)去那里時,它們會觸發一些由它們背后的服務器定義的操作。 該服務器的功能沒有標准,因此 Web 服務具有靈活性。 因此,如果您的服務器正在以這種方式接受 HTTP 請求以促進文件復制,您將不得不自己動手,並將文件數據傳遞到 POST 請求中。
換句話說,(1) 不要將 URI 視為文件系統路徑 - 它們不是,(2) 找到一個 FTP 庫來復制文件,和/或 (3) 如果您真的想構建一個執行此操作的 Web 服務通過 POST 請求抽象文件復制的詳細信息。 如果您這樣做#3 了解您的建築非常接近於定制,並且它可能僅適用於遵循您的特定設計的站點子集(即您自己構建的站點)。 我知道沒有標准的參數集或通過 POST 命令的“文件復制”,我知道您可以利用它來使這個“正常工作” - 您將必須將您的 HTTP 請求與 Web 服務匹配服務器端。
你可以做:
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"
現在您可以在absolute
URI 上調用toURL().openStream()
。
我不得不處理類似的問題並寫了一個小方法來解決這個問題,你可以在下面找到。
它適用於 URL 和相對后綴的串聯。 由於 URI 解析函數的行為,請注意不要給后綴絕對值。
private URI resolveURI(String root, String suffix) {
URI uri;
try {
uri = new URI(root + "/").resolve(suffix);
} catch (URISyntaxException e) {
//log
}
return uri;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.