Преобразование InputStream в byte[] на Java — все способы с примерами

Очень частая задача — получить из потока ввода (InputStream) «сырой» массив байтов (byte[]), чтобы потом удобно с ним работать: посчитать хэш, передать в другой метод, сохранить и т. д. Рассмотрим два способа: современный (readAllBytes()) и «классический» — через ByteArrayOutputStream.

Чтобы понять этот пример, желательно знать:

  • Класс InputStream

  • Класс ByteArrayInputStream

  • Класс ByteArrayOutputStream

Пример 1: преобразование InputStream в массив байтов

import java.io.InputStream;
import java.util.Arrays;
import java.io.ByteArrayInputStream;

public class Main {

  public static void main(String args[]) {

    try {

      // create an input stream
      byte[] input = {1, 2, 3, 4};
      InputStream stream = new ByteArrayInputStream(input);
      System.out.println("Input Stream: " + stream);

      // convert the input stream to byte array
      byte[] array = stream.readAllBytes();
      System.out.println("Byte Array: " + Arrays.toString(array));

      stream.close();
    }

    catch (Exception e) {
      e.getStackTrace();
    }
  }
}

Вывод:

Input Stream: java.io.ByteArrayInputStream@27082746
Byte Array: [1, 2, 3, 4]

В примере выше мы создали поток ввода stream. Обратите внимание на строку:

byte[] array = stream.readAllBytes();

Метод readAllBytes() возвращает все данные из потока и сохраняет их в массиве байтов.

Примечание

Мы использовали метод Arrays.toString(), чтобы преобразовать массив целиком в удобную для печати строку.

Пример 2: преобразование InputStream в массив байтов через OutputStream

import java.io.InputStream;
import java.util.Arrays;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;

public class Main {

  public static void main(String args[]) {

    try {

      // create an input stream
      byte[] input = {1, 2, 3, 4};
      InputStream stream = new ByteArrayInputStream(input);
      System.out.println("Input Stream: " + stream);

      // create an output stream
      ByteArrayOutputStream output = new ByteArrayOutputStream();
      // create a byte array to store input stream
      byte[] array = new byte[4];
      int i;

      // read all data from input stream to array
      while ((i = stream.read(array, 0, array.length)) != -1) {

        // write all data from array to output
        output.write(array, 0, i);
      }

      byte[] data = output.toByteArray();

      // convert the input stream to byte array
      System.out.println("Byte Array: " + Arrays.toString(data));
      stream.close();
    }

    catch (Exception e) {
      e.getStackTrace();
    }
  }
}

Вывод:

Input Stream: java.io.ByteArrayInputStream@27082746
Byte Array: [1, 2, 3, 4]

В этом примере мы создали поток ввода из массива input. Обратите внимание на выражение:

stream.read(array, 0, array.length)

Здесь все элементы из потока stream сохраняются в массив array, начиная с индекса 0. Затем мы записываем все элементы массива array в выходной поток output:

output.write(array, 0, i)

В конце мы вызываем метод toByteArray() класса ByteArrayOutputStream, чтобы преобразовать выходной поток в массив байтов data.

Совет

Способ через ByteArrayOutputStream универсален и подходит для любых InputStream (например, файловых или сетевых), где данные приходят порциями.