Как использовать BytearrayOutputStream и DataOutputStream одновременно (Java)
-
24-10-2019 - |
Вопрос
У меня здесь довольно проблема, и я думаю, что это потому, что я не очень много понимаю, как мне следует использовать 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()