Как использовать ByteArrayOutputStream и DataOutputStream одновременно (Java)

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

Мне нужно написать int и a 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().

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

Ответ 1

Вот так:

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

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

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

Ответ 3

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

Ответ 4

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

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

  • put(byte[] src) для byte[]
  • putInt(int value)
  • и byte[] array() для получения содержимого

Ответ 5

Вам больше не нужно

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

Ответ 6

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