Подтвердить что ты не робот

Как поместить данные из OutputStream в ByteBuffer?

В Java мне нужно поместить содержимое из OutputStream (я сам заполняю данные в этот поток) в ByteBuffer. Как это сделать простым способом?

4b9b3361

Ответ 1

Вы можете создать ByteArrayOutputStream и записать на него и извлечь содержимое как byte[] с помощью toByteArray(). Затем ByteBuffer.wrap(byte []) создаст ByteBuffer с содержимым выходного байтового массива.

Ответ 2

Существует более эффективный вариант ответа @DJClayworth.

Как правильно заметил, 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());

В результате, как только весь вывод написан, в качестве основы для входного потока используется один и тот же буфер.

Ответ 3

Хотя вышеупомянутые ответы решают вашу проблему, ни одна из них не эффективна, как вы ожидаете от NIO. ByteArrayOutputStream или MyByteArrayOutputStream сначала записывают данные в память кучи Java, а затем копируют их в ByteBuffer, что существенно влияет на производительность.

Эффективная реализация будет писать сам класс ByteBufferOutputStream. На самом деле это довольно легко сделать. Вы должны просто предоставить метод write(). См. Эту ссылку для ByteBufferInputStream.

Ответ 4

Попробуйте использовать PipedOutputStream вместо OutputStream. Затем вы можете подключить PipedInputStream для чтения данных из PipedOutputStream.