Как использовать 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()