У меня есть настоящая проблема здесь, и я думаю, что это - потому что я не понимаю очень много, как я должен использовать API, обеспеченный Java.
Я должен записать int
и a byte[]
в a byte[]
Я думал об использовании a 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 ()
. На самом деле такого конструктора нет.
Класс Integer имеет метод для получения байтового значения int.
Integer.byteValue ()
Используйте первый случай - оберните DataOutputStream
вокруг ByteArrayOutputStream
. Просто убедитесь, что вы сохранили ссылку на ByteArrayOutputStream
. Когда вы закончите close () или, по крайней мере, flush () DataOutputStream
, а затем используйте метод toByteArray для ByteArrayOutputStream
.
Не могли бы вы сделать переменную для хранения ByteArrayOutputStream и передать ее в DataOutputStream.
ByteArrayOutputStream baos = new ByteArrayOutputStream();
DataOutputStream dos = new DataOutputStream(baos);
dos.writeInt(1);
byte[] result = dos.toByteArray();
Вы можете использовать потоковый подход, если вы соедините ваш выходной поток с входным потоком через PipedInputStream
/PipetOutputStream
. Затем вы будете потреблять данные из входного потока.
В любом случае, если то, что вам нужно сделать, просто и не требует потокового подхода, я бы использовал java.nio. ByteBuffer
, на котором у вас есть
put(byte[] src)
для вашего byte[]
putInt(int value)
byte[] array()
для получения содержимого