17

Google Guavaには、InputSuppliersを作成するためのファクトリメソッドがいくつかありますbyte[]

ByteStreams.newInputStreamSupplier(bytes);

またはからFile

Files.newInputStreamSupplier(file);

InputSupplier与えられたものを作成する同様の方法はありInputStreamますか?

つまり、匿名クラスよりも簡潔な方法です。

new InputSupplier<InputStream>() {
    public InputStream getInput() throws IOException {
        return inputStream;
    }
};

Files.copy(...)背景:egまたは。でInputStreamsを使用したいと思いByteStreams.equal(...)ます。

4

3 に答える 3

13

任意のものをに変換する方法はありませんInputStream。これは、メソッドが呼び出されるたびに新しい新しいオブジェクトを作成できるオブジェクトであると想定されているInputSupplier<InputStream>ためです。これは、基になるバイトのソースが再利用できる場合にのみ可能です。したがって、またはを取り、を返すファクトリメソッド。InputSupplier<InputStream>InputStreamgetInput()byte[]FileInputSupplier<InputStream>

ディミトリスが示唆するように、にInputSupplier関連するInputStreamのと同じ方法でにIterable関連しIteratorます。説明する匿名クラスは、呼び出されるたびに同じgetInput()ストリームを返すため、正しくありません。したがって、後続の呼び出しInputStreamでは、すでに使い果たされて閉じられているが返されます。

匿名クラスのもう1つの問題InputSupplierは、実際の可視性を制限してInputStream自動的に閉じることができるようにすることです。外部から見えるものをでラップし、InputStreamそれInputSupplierをユーティリティメソッドに渡すと、ユーティリティメソッドがを閉じる可能性がありますInputStream。あなたはそれで大丈夫かもしれませんが、それはGuavaが促進したいと思うクリーンな使用パターンではありません。

同じことをやりたいと思ったとき、逆にやっていることに気づきました。これを行う代わりに:

Files.copy(InputSupplier.of(inputStream), destinationFile);

(存在しません)、代わりにこれを行う必要があります:

ByteStreams.copy(inputStream, Files.newOutputStreamSupplier(destinationFile));
于 2013-10-23T23:08:25.513 に答える
10

いいえ、何も見ていません。
私はあなたが最善の方法を見つけたと思います。
入力ストリームをバイト配列またはファイルに格納し、ByteStreams.newInputStreamSupplier()またはFiles.newInputStreamSupplier()を使用してサプライヤーを作成する唯一の代替手段ですが、そのようにすることはお勧めしません。
あなたも使うことができます

public static long copy(InputStream from, OutputStream to)
から
ByteStreams
参照:src

于 2010-03-02T13:56:13.253 に答える
2

IteratorをIterableにラップするのと同じくらい間違っていると思いますが、そのようなものがライブラリに入る可能性はゼロのように感じます。elouが言うように、ByteStreams.copy()メソッドを使用できますが、2つのストリームでequals()を実行する明確な理由はないようです。

私はグアバの作者がそのような(些細な)方法を追加することをためらっていることを理解しています-完全に(または部分的に、しかしストリームがどこに残っているかわからないので、その後は使用できないのと同じくらい良いです)2つのストリームを読んでそれらがデータの他の処理なしで同じですか?これらのバイトは、ネットワークソケットなど、繰り返し不可能な読み取りソースからのものですか?それ以外の場合、それがどこかのファイル、またはメモリ内のバイト配列である場合は、同等性テストを実行するのに役立つ他の方法があります。

于 2010-03-17T13:28:39.820 に答える