簡體   English   中英

URL 的 java.nio.file.Path ?

[英]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()) {
    // ...
}

它適用於httphttps和開箱即用的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM