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

StackOverflow https://stackoverflow.com/questions/2984538

Вопрос

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

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

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

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

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

или же

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

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

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

Это было полезно?

Решение

Как это:

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

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

w.flush();

byte[] result = baos.toByteArray();

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

Другие советы

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

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

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

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

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

  • put(byte[] src) для тебя byte[]
  • putInt(int value)
  • а также byte[] array() Чтобы получить контент

Тебе не нужно больше подобного

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top