как использовать ByteArrayOutputStream и DataOutputStream одновременно (Java) - PullRequest
11 голосов
/ 06 июня 2010

У меня здесь довольно большая проблема, и я думаю, что это потому, что я не очень понимаю, как я должен использовать API, предоставляемый Java.

Мне нужно записать int и byte[] в byte[]

Я думал об использовании DataOutputStream для решения записи данных с writeInt(int i) и write(byte[] b), и чтобы иметь возможность поместить это в байтовый массив, я должен использовать ByteArrayOutputStream метод toByteArray().

Я понимаю, что в этих классах используется шаблон Wrapper, поэтому у меня было два варианта:

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

или

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

но в обоих случаях я "теряю" метод. в первом случае я не могу получить доступ к методу toByteArray(), а во втором я не могу получить доступ к методу writeInt().

Как мне использовать эти классы вместе?

Ответы [ 6 ]

38 голосов
/ 06 июня 2010

Как это:

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

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

w.flush();

byte[] result = baos.toByteArray();

На самом деле ваша вторая версия не будет работать вообще. DataOutputStream требует фактического целевого потока для записи данных. Вы не можете сделать new DataOutputStream(). На самом деле такого конструктора не существует.

2 голосов
/ 06 июня 2010

Не могли бы вы сделать переменную для хранения в ByteArrayOutputStream и передать его в DataOutputStream.

ByteArrayOutputStream baos = new ByteArrayOutputStream();
DataOutputStream dos = new DataOutputStream(baos);
dos.writeInt(1);
byte[] result = dos.toByteArray();
1 голос
/ 03 апреля 2017

Тебе больше не нужно, как это

Example exampleExample = method(example); 
ByteArrayOutputStream baos = new ByteArrayOutputStream(); marshaller.marshal(exampleExample , baos);
Message message = MessageBuilder.withBody(baos.toByteArray()).build();
1 голос
/ 06 июня 2010

Вы можете использовать потоковый подход, если подключите свой выходной поток к входному потоку через PipedInputStream / PipetOutputStream. Затем вы будете использовать данные из входного потока.

В любом случае, если то, что вам нужно сделать, просто и не требует потокового подхода, я бы использовал java.nio.ByteBuffer, на котором у вас

  • put(byte[] src) для вашего byte[]
  • putInt(int value)
  • и byte[] array() для получения контента
1 голос
/ 06 июня 2010

Используйте первый случай - оберните DataOutputStream вокруг ByteArrayOutputStream. Просто убедитесь, что вы сохранили ссылку на ByteArrayOutputStream. Когда вы закончите close () или хотя бы flush (), DataOutputStream, а затем используйте метод toByteArray ByteArrayOutputStream.

0 голосов
/ 06 июня 2010

В классе Integer есть метод для получения байтового значения типа int. Integer.byteValue()

...