作成時間をできるだけ少なくして、入力ストリームを複製する方法を教えてもらえますか? IS を処理する複数のメソッドに対して、入力ストリームを複数回複製する必要があります。3 つの方法を試しましたが、何らかの理由でうまくいきません。
方法 #1: stackoverflow コミュニティのおかげで、次のリンクが役立つことがわかり、プログラムにコード スニペットを組み込みました。
ただし、このコードを使用すると、複製された入力ストリームを作成するのに最大 1 分 (10MB のファイルの場合) かかる場合があり、私のプログラムはできるだけ高速である必要があります。
int read = 0;
byte[] bytes = new byte[1024*1024*2];
ByteArrayOutputStream bos = new ByteArrayOutputStream();
while ((read = is.read(bytes)) != -1)
bos.write(bytes,0,read);
byte[] ba = bos.toByteArray();
InputStream is1 = new ByteArrayInputStream(ba);
InputStream is2 = new ByteArrayInputStream(ba);
InputStream is3 = new ByteArrayInputStream(ba);
方法 #2: BufferedInputStream を使用して IS のクローンも試しました。これは高速でした (最も遅い作成時間 == 1 ミリ秒、最も速い == 0 ミリ秒)。しかし、処理する is1 を送信した後、is2 および is3 を処理するメソッドは、処理するものが何もないというエラーをスローしました。これは、以下の 3 つの変数すべてが同じ IS を参照しているようなものです。
is = getFileFromBucket(path,filename);
...
...
InputStream is1 = new BufferedInputStream(is);
InputStream is2 = new BufferedInputStream(is);
InputStream is3 = new BufferedInputStream(is);
方法 #3: コンパイラが嘘をついていると思います。上記の 2 つの例では、is1 の markSupported() を確認しました。true が返されたので、実行できると思いました
is1.mark()
is1.reset()
あるいは単に
is1.reset();
IS をそれぞれのメソッドに渡す前に。上記の両方の例で、無効なマークであるというエラーが表示されます。
私は今アイデアがありませんので、あなたが私に与えることができる助けを事前に感謝します.
PS 人々から受け取ったコメントから、私の状況に関していくつかのことを明確にする必要があります: 1) このプログラムは VM で実行されています 2) 入力ストリームは別のメソッドから渡されています。ローカル ファイルから読み取っていません 3) 入力ストリームのサイズが不明です