В Java мне нужно поместить содержимое из OutputStream (я сам заполняю данные в этот поток) в ByteBuffer. Как это сделать простым способом?Как поместить данные из OutputStream в ByteBuffer?
ответ
Вы можете создать ByteArrayOutputStream
и написать ему и извлечь содержимое в виде byte[]
, используя toByteArray()
. Затем ByteBuffer.wrap(byte [])
создаст ByteBuffer
с содержимым выходного массива байтов.
Это именно то, что я сделал незадолго до того, как прочитал ваш комментарий. Поэтому я могу утверждать, что это работает :)) – drasto
К сожалению, 'ByteArrayOutputStream # toByteArray()' делает копию базового байтового массива, поэтому, хотя этот рецепт прост, он не так эффективен, как нам бы хотелось. Однако, поскольку «ByteBuffer» фиксирован в емкости, желание записать произвольное количество данных через «OutputStream» в 'ByteBuffer' непримиримо. – seh
@seh Это не должно быть так - см. Мой ответ. – mark
Попробуйте использовать PipedOutputStream вместо OutputStream. Затем вы можете подключить PipedInputStream для чтения данных из PipedOutputStream.
Выглядит хорошо. Аналогичное мнение можно сделать с ByteArrayOutputStream, вызвав его метод newInputStream. Тем не менее, существует более сложное решение - обернуть массив, который напрямую поддерживает ByteArrayOutputStream в ByteBuffer. Это то, что я сделал. – drasto
Существует более эффективный вариант ответа @ DJClayworth.
Как @seh правильно заметили, ByteArrayOutputStream.toByteArray()
возвращает копию объекта подложки byte[]
, который может быть неэффективным. Однако объект поддержки byte[]
, а также количество байтов являются защищенными членами класса ByteArrayOutputStream
. Таким образом, вы можете создать свой собственный вариант ByteArrayOutputStream подвергая их непосредственно:
public class MyByteArrayOutputStream extends ByteArrayOutputStream {
public MyByteArrayOutputStream() {
}
public MyByteArrayOutputStream(int size) {
super(size);
}
public int getCount() {
return count;
}
public byte[] getBuf() {
return buf;
}
}
Используя этот класс легко:
MyByteArrayOutputStream out = new MyByteArrayOutputStream();
fillTheOutputStream(out);
return new ByteArrayInputStream(out.getBuf(), 0, out.getCount());
В результате, когда все выходные данные записываются тот же буфер используется как основу входного потока.
Хорошая точка, @mark. У меня есть такой класс в нескольких моих Java-проектах, обычно ограниченный как пакетно-частный класс под названием «PromiscuousByteArrayOutputStream». Имя преднамеренно длинное и зловещее. – seh
getCount() не требуется, поскольку ByteArrayOutputStream.size() возвращает count. –
Несмотря на то, что вышеупомянутые ответы решают вашу проблему, ни одна из них не эффективна, как вы ожидаете от NIO. ByteArrayOutputStream или MyByteArrayOutputStream сначала записывают данные в память кучи Java, а затем копируют их в ByteBuffer, что существенно влияет на производительность.
Эффективная реализация будет писать класс ByteBufferOutputStream самостоятельно. На самом деле это довольно легко сделать. Вы должны просто предоставить метод write(). См. Эту ссылку для ByteBufferInputStream.
, так как нам может понадобиться повторно использовать существующий ByteBuffer (и его базовый массив) для OutputStream вместо выделения нового массива для получения нового ByteBuffer, я считаю, что этот ответ более приемлем. – Ambling
- 1. Как поместить содержимое ByteBuffer в OutputStream?
- 2. Java FileInput/OutputStream и ByteBuffer
- 3. Как читать данные ByteBuffer
- 4. как напечатать строку из ByteBuffer
- 5. Как удалить буферизованные данные в буферизованный OutputStream?
- 6. Как хранить данные JVM в ByteBuffer?
- 7. ByteBuffer кажется из Bounds
- 8. Получить многоязычные данные от ByteBuffer
- 9. Как поместить данные из цикла в массив
- 10. Как поместить данные в изображение из последовательности
- 11. Как конвертировать из ByteBuffer в Avro байты?
- 12. Как я могу прочитать меньший ByteBuffer из более крупного ByteBuffer?
- 13. C++ OutputStream удалить сохраненные данные
- 14. Как работает PipedInputStream из OutputStream?
- 15. Создать DataBufferUShort из ByteBuffer
- 16. Передача байтов из одного ByteBuffer в другой
- 17. Конвертировать из FileStream в OutputStream?
- 18. из OutputStream в поток файлов
- 19. Как поместить данные в TKinter?
- 20. Как поместить данные в массив?
- 21. Лучший способ копирования InputStream в OutputStream
- 22. прибудете OutputStream из BufferedReader
- 23. Получить контент из outputstream
- 24. Создать файл из OutputStream
- 25. Как правильно использовать ByteBuffer?
- 26. Получить данные IP-пакета от ByteBuffer
- 27. Поместить данные объекта из службы в действие
- 28. Bytebuffer в Java
- 29. Получите OutputStream в строку
- 30. Возможно ли создать ByteBuffer из списка <ByteBuffer>?
Как правило, вы не можете читать напрямую из потока вывода. Если вы сами заполняете данные, почему бы вам не заполнить его в ByteBuffer? –
Это можно косвенно и непосредственно из него прочитать, если вы создаете класс, который наследует форму OutputStream и позволяет читать с нее напрямую. Я сам не заполнял данные, некоторые рамки (и код рамки, который я не хочу прикоснуться к причине). См. Также мои комментарии и ответы. – drasto