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

Как читать один поток в другой?

FileInputStream in = new FileInputStream(myFile);
ByteArrayOutputStream out = new ByteArrayOutputStream();

Вопрос: Как я могу читать все из in в out способом, который не является циклом, созданным вручную, с моим собственным байтовым буфером?

4b9b3361

Ответ 1

Напишите один метод для этого и вызовите его везде, где нужны функции. Guava уже имеет для этого код, ByteStreams.copy. Я уверен, что в любой другой библиотеке с "общей" функциональностью IO есть тоже, но Guava - моя первая "go-to" библиотека, где это возможно. Это скалы:)

Ответ 2

В Apache Commons/IO вы можете сделать это с помощью IOUtils.copy(in, out):

InputStream in = new FileInputStream(myFile);
OutputStream out = new ByteArrayOutputStream();
IOUtils.copy(in, out);

Но я согласен с Джоном Скитом, я предпочел бы использовать Guava ByteStreams.copy(in, out)

Ответ 3

Итак, что Guava ByteStreams.copy(in, out) делает:

  private static final int BUF_SIZE = 0x1000; // 4K

  public static long copy(InputStream from, OutputStream to)
      throws IOException {
    checkNotNull(from);
    checkNotNull(to);
    byte[] buf = new byte[BUF_SIZE];
    long total = 0;
    while (true) {
      int r = from.read(buf);
      if (r == -1) {
        break;
      }
      to.write(buf, 0, r);
      total += r;
    }
    return total;
  }

Ответ 4

Java 9 (и позже) ответ:

    in.transferTo(out);

Похоже, они наконец-то поняли, что эта функциональность настолько необходима, что ее лучше встроить. Метод возвращает количество байтовых копий, если вам нужно знать.

Ответ 5

В моем проекте я использовал этот метод:

private static void copyData(InputStream in, OutputStream out) throws Exception {
    byte[] buffer = new byte[8 * 1024];
    int len;
    while ((len = in.read(buffer)) > 0) {
        out.write(buffer, 0, len);
    }
}

Ответ 6

В качестве альтернативы Guava можно использовать Apop Commons IO (старый) и Apache Commons IOUtils (новый, как указано в комментарии).

Ответ 7

Я бы использовал цикл вместо импорта новых классов или добавлял библиотеки в свой проект. Функция библиотеки, вероятно, также реализована с помощью цикла. Но это только мой личный вкус.

Однако, мой вопрос к вам: что вы пытаетесь сделать? Подумайте о "большой картине", если вы хотите поместить все содержимое файла в массив байтов, почему бы просто не сделать это? Размер атрибута - file.length(), и вам не нужно динамически расти, скрываясь за ByteArrayOutputStream (если ваш файл не используется совместно, и его содержимое может измениться во время чтения).

Другая альтернатива: можете ли вы использовать FileChannel и ByteBuffer (java.nio)?