web-dev-qa-db-ja.com

ByteArrayOutputStreamとDataOutputStreamを同時に使用する方法(Java)

ここでかなり問題がありますが、Javaが提供するAPIの使い方がよくわからないからだと思います。

intと_byte[]_を_byte[]_に書き込む必要があります

DataOutputStreamを使用してwriteInt(int i)write(byte[] b)でのデータ書き込みを解決し、それをバイト配列に入れることができるようにするには、ByteArrayOutputStreamメソッドtoByteArray().を使用する必要があります。

このクラスがラッパーパターンを使用していることを理解しているので、2つのオプションがありました。

_DataOutputStream w = new DataOutputStream(new ByteArrayOutputStream());
_

または

_ByteArrayOutputStream w = new ByteArrayOutputStream(new DataOutputStream());
_

しかし、どちらの場合も、私はメソッドを「緩め」ます。前者の場合、toByteArray()メソッドにアクセスできず、後者の場合、writeInt()メソッドにアクセスできません。

このクラスを一緒に使用するにはどうすればよいですか?

11
Manuel Aráoz

このような:

_ByteArrayOutputStream baos = new ByteArrayOutputStream();
DataOutputStream w = new DataOutputStream(baos);

w.writeInt(100);
w.write(byteArray);

w.flush();

byte[] result = baos.toByteArray();
_

実際、2番目のバージョンはまったく機能しません。 DataOutputStreamには、データを書き込む実際のターゲットストリームが必要です。 new DataOutputStream()はできません。実際、そのようなコンストラクターはありません。

39
Mihai Toader

ByteArrayOutputStreamを保持する変数を作成し、それをDataOutputStreamに渡すことができますか。

ByteArrayOutputStream baos = new ByteArrayOutputStream();
DataOutputStream dos = new DataOutputStream(baos);
dos.writeInt(1);
byte[] result = dos.toByteArray();
2
Yack

前者の場合を使用します-DataOutputStreamByteArrayOutputStreamにラップします。 ByteArrayOutputStreamへの参照を必ず保存してください。 close()または少なくともflush()が終了したら、DataOutputStreamを実行してから、ByteArrayOutputStreamのtoByteArrayメソッドを使用します。

PipedInputStream/PipetOutputStreamを介して出力ストリームを入力ストリームに接続する場合は、ストリームアプローチを使用できます。次に、入力ストリームからのデータを消費します。

とにかく、あなたがする必要があることが単純で、ストリームアプローチを必要としないなら、私はあなたが持っている_Java.nio.ByteBuffer_を使うでしょう

  • put(byte[] src) for your _byte[]_
  • putInt(int value)
  • およびbyte[] array()でコンテンツを取得します
1
Jack

このようなものは必要ありません

Example exampleExample = method(example); 
ByteArrayOutputStream baos = new ByteArrayOutputStream(); marshaller.marshal(exampleExample , baos);
Message message = MessageBuilder.withBody(baos.toByteArray()).build();
1
mantamusica

Integerクラスには、intのバイト値を取得するメソッドがあります。 Integer.byteValue()

0
Goibniu