web-dev-qa-db-ja.com

URLのjava.nio.file.Path?

Java7には、ローカルファイルのデフォルトの Path 実装が付属しています。 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をスローします。私はおそらくこれを自分で実装することもできますが、車輪の再発明はしたくありません。

33
Gili

あなたが本当にやろうとしていることは、FTPが行うことを達成することのようです-ある場所から別の場所にファイルをコピーします。既存のFTPコードライブラリでこれを行うためのより良い方法を見つけることをお勧めします。

URIはファイルシステムパスではないため、そのように扱うことはできません。これらはアドレス/リソースロケーターであり、ブラウザー(またはそれらを処理する別のクライアント)を使用してそこに移動すると、背後にあるサーバーによって定義されたアクションをトリガーします。そのサーバーが何をするかについての標準はないので、Webサービスの柔軟性があります。したがって、サーバーがファイルのコピーを容易にするためにこの方法でHTTPリクエストを受け入れようとしている場合は、独自にロールして、ファイルデータをPOSTリクエストに渡す必要があります。

別の言い方をすれば、(1)URIをファイルシステムパスのように扱わないでください-そうではありません、(2)ファイルをコピーするためのFTPライブラリを見つける、および/または(3)本当にビルドしたい場合これを行うWebサービスでは、POSTリクエストを介してファイルコピーの詳細を抽象化します。#3を実行する場合は、建物がカスタムに非常に近く、おそらく機能するだけであることを理解してください。特定の設計に従ったサイトのサブセット(つまり、自分で作成したサイト)。POSTコマンドを介した標準のパラメーターセットまたは「ファイルコピー」はありません。これを「正しく機能」させるために活用できます。HTTPリクエストをサーバー側のWebサービスと照合する必要があります。

2
jefflunt

できるよ:

_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"
_

これで、absoluteURIでtoURL().openStream()を呼び出すことができます。

0
Oliv