Преобразование 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
(например, файловых или сетевых), где данные приходят порциями.