2016-04-14 18 views
2

その内容を変更してinputStreamを再利用する方法はありますか? (新しい声明なし)。

たとえば、要件に非常に近いものがありましたが、十分ではありません

次のコードでは、SequenceInputStreamを使用していて、そのシーケンスに新しいInputStreamを追加するたびに使用しています。

しかし、私は同じInputStreamを使用して同じことをしたいと思います(私はInputStreamの実装が気にしません)。

私はmark()/ reset()APIについて考えましたが、まだ読み込むコンテンツを変更する必要があります。新しいのInputStreamの作品を避けるためにJava I/O - 再利用InputStreamオブジェクト

アイデアがあるため、パフォーマンスの問題

 //Input Streams 
    List<InputStream> inputStreams = new ArrayList<InputStream>(); 
    try{ 
     //First InputStream 
     byte[] input = new byte[]{24,8,102,97}; 
     inputStreams.add(new ByteArrayInputStream(input)); 

     Enumeration<InputStream> enu = Collections.enumeration(inputStreams); 
     SequenceInputStream is = new SequenceInputStream(enu); 

     byte [] out = new byte[input.length]; 
     is.read(out); 

     for (byte b : out){ 
      System.out.println(b);//Will print 24,8,102,97 
     } 

     //Second InputStream 
     input = new byte[]{ 4,66}; 
     inputStreams.add(new ByteArrayInputStream(input)); 
     out = new byte[input.length]; 
     is.read(out); 

     for (byte b : out){ 
      System.out.println(b);//will print 4,66 
     } 
     is.close(); 
    }catch (Exception e){// 
    } 
+0

「ベクター」!私たちは21世紀です! –

+1

'Vector'の代わりに' ArrayList'を考えれば、あなたはパフォーマンスで勝つでしょう – Andrew

+0

@AndrewTobilkoあなたはそれについて確かですか? https://en.wikipedia.org/wiki/Java_performance#Escape_analysis_and_lock_coarseningは、特にJava 6以降で必要な場合を除き、「Vector」ロックの例を挙げています。もちろん、それはロックが不要であることを検出するエスケープ解析に依存しています。 'ArrayList'を使うことは、(明示的に行われていない限り)ロックが一切行われないことを意味します。 –

答えて

0

あなたは独自の実装(サブクラス)を作成することができます。

しかし、以下のリンク参照してください、彼らは助けるかもしれません。私はそこに既存の実装があるのか​​疑問です。

このようなことから、測定可能なパフォーマンスが向上することは間違いありません。 FileInputStreamを実行する必要はありません。Javaは短命オブジェクトをガベージコレクションするために最適化されています。

関連する問題