2017-08-31 24 views
1

タイプ Stream<Object>InputStreamに変換するにはどうすればよいですか?現在、私はInputStreamの先のByteArrayに変換し、それを追加するデータのすべてを反復子とループを得る:ストリーム<Object>〜入力ストリーム

ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
ObjectOutputStream oos = new ObjectOutputStream(bos); 

Iterator<MyType> myItr = MyObject.getStream().iterator(); 

while (myItr.hasNext()) { 

     oos.writeObject(myItr.next().toString() 
     .getBytes(StandardCharsets.UTF_8)); 
    } 
    oos.flush(); 
    oos.close(); 

    InputStream is = new ByteArrayInputStream(bao.toByteArray()); 

しかしこれを行うためのオーバーヘッドは何ですか?ストリームにテラバイトのデータが含まれている場合は、テラバイトのデータをメモリに吸い込まないでください。これを達成するためのより良い方法はありますか?

+0

はあなたが確認していますメモリにセット全体をロードすることはありませんようStreamオフオブジェクトを引っ張って、InputStreamが読み込まれるStream上の端末操作を呼び出し、この種'InputStream'の必要は何ですか?オブジェクトを文字列に変換し、UTF-8表現をバイト配列として取得し、これらの配列オブジェクトにオブジェクト直列化を使用します。もう一方の側で受け取ってほしいことはまったく不明ですが、現在でもオブジェクトでも文字列でもありません。代わりに文字列を直接書くこともできますし、オブジェクト直列化プロトコルのオーバヘッドなしにWriterを使って簡単なテキスト表現を書くこともできますが、元のオブジェクトを再作成することはできません。 – Holger

答えて

2

あなたはパイプを使用してInputStreamOutputStreamを変換することができるはずです。

this answerに触発
PipedOutputStream pos = new PipedOutputStream(); 
InputStream is = new PipedInputStream(pos); 

new Thread(() -> { 
    try (ObjectOutputStream oos = new ObjectOutputStream(pos)) { 
     Iterator<MyType> myItr = MyObject.getStream().iterator(); 
     while (myItr.hasNext()) { 
      oos.writeObject(myItr.next().toString() 
       .getBytes(StandardCharsets.UTF_8)); 
     } 
    } catch (IOException e) { 
     // handle closed pipe etc. 
    } 
}).start(); 

+0

ええと...私はこのコードが何をすべきか分かりません。 posには決してデータが割り当てられません:Sと入力ストリームに含まれる内容に結びついていないので、私たちはループしていて、myItrからoosに内容を追加するようなことはありません。ここに何かがないのですか? – BigBug

+1

'is'と' oos'はどちらも 'pos'に結び付けられています。これは出力ストリームから入力ストリームにデータをパイプします。しかし、今私はそれを考えて、それはまだメモリ内のすべてをバッファリングする必要があるので、これはあなたの問題を本当に解決しません。 – shmosel

+2

@BigBug Ok私はそれをすべて記憶にバッファリングするのは間違っていた。実際にはバッファサイズに達するとブロックされます。つまり、出力ストリームを別のスレッドに渡す必要があります。私の更新された答えを見てください。 – shmosel

0

これはあなたのために働くでしょうか?

https://gist.github.com/stephenhand/292cdd8bba7a452d83c51c00d9ef113c

これは、入力データとしてStream<byte[]>を取るInputStream実装です。バイト配列への任意のオブジェクトを.map()する必要がありますが、各オブジェクトをバイトとして表現する必要があります。

はそれだけで、消費者がInputStreamのより読み込むので、それは

関連する問題