web-dev-qa-db-ja.com

OutputStreamをByteArrayOutputStreamに変換します

OutputStreamByteArrayOutputストリームに変換しようとしています。これを行う方法について、明確で簡単な答えを見つけることができませんでした。この質問はStackOverflowの質問のタイトルで尋ねられましたが、質問の本文ではByteArrayStreamOuputStreamに変更する方法を尋ねています。既に作成されているOutputStreamがあり、回答に示されているこの例はコンパイルされません!

その質問はこちらです

既に構築され、waveHeaderと呼ばれる44バイトの長さのOutputStreamがあります。それをByteArrayOutputStreamに変換したいのは、後のプロセスで簡単にするために、waveHeader.ToByteArray()でそれをbyte []に​​変更できるようにするためです。

単純なタイプのキャストまたはこれを可能にするものはありますか?

そうでない場合:

  • 変換できない場合、元のOutputStreamのデータへのポインターを作成する方法はありますか?

  • OutputStreamに含まれるデータにアクセスするにはどうすればよいでしょうか?

私はJavaが初めてです。これは私の趣味です。はるかに簡単なVisualBasic .netのストリーム!

15
Bill Smith

考えられるシナリオは複数あります。

a)ByteArrayOutputStreamがありますが、OutputStreamとして宣言されています。次に、次のようなキャストを実行できます。

void doSomething(OutputStream os)
{
    // fails with ClassCastException if it is not a BOS
    ByteArrayOutputStream bos = (ByteArrayOutputStream)os;
...

b)他のタイプの出力ストリームがある場合、それをBOSに変換することは実際には意味がありません。 (通常、結果配列にアクセスするためにキャストします)。したがって、この場合、新しいストリームを簡単にセットアップして使用します。

void doSomething(OutputStream os)
{
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    bos.write(something);
    bos.close();
    byte[] arr = bos.toByteArray();
    // what do you want to do?
    os.write(arr); // or: bos.writeTo(os);
...

c)何らかの種類のOutputStreamに何かを書き込んだ場合(たとえば、サーブレットから取得したためにそれが何であるかがわからない場合)、その情報を取得する方法はありません。後で必要なものを書いてはいけません。解決策は、b)独自のストリームに書き込むという答えです。配列を実際の出力ストリームに書き込むだけでなく、独自の目的に使用することもできます。

ByteArrayOutputStreamsはすべてのデータをメモリに保持することに注意してください。

24
eckes

writeToByteArrayOutputStreamメソッドを使用できます。

ByteArrayOutputStream bos = new ByteArrayOutputStream();
byte[] bytes = new bytes[8];
bos.write(bytes);
bos.writeTo(oos);

ByteArrayOutputStreamのインスタンスを作成できます。次に、このByteOutputStreamインスタンスにデータを書き込み、writeToを受け入れるOutputStreamメソッドを使用して、ByteArrayOutputStreamを有効にすることができます。引数として渡したOutputStreamのインスタンスへの出力。

7
Rahul Bobhate