Pregunta Convertir InputStream en matriz de bytes en Java


¿Cómo leo un entero InputStream en una matriz de bytes?


676
2017-08-12 07:27


origen


Respuestas:


Puedes usar Apache Commons IO para manejar esto y tareas similares.

los IOUtils tipo tiene un método estático para leer un InputStream y devuelve un byte[].

InputStream is;
byte[] bytes = IOUtils.toByteArray(is);

Internamente esto crea un ByteArrayOutputStream y copia los bytes a la salida, luego llama toByteArray(). Maneja archivos grandes copiando los bytes en bloques de 4KiB.


939
2017-08-12 07:35



Necesita leer cada byte de su InputStream y escribirlo a ByteArrayOutputStream. A continuación, puede recuperar la matriz de bytes subyacente llamando toByteArray(); p.ej.

InputStream is = ...
ByteArrayOutputStream buffer = new ByteArrayOutputStream();

int nRead;
byte[] data = new byte[16384];

while ((nRead = is.read(data, 0, data.length)) != -1) {
  buffer.write(data, 0, nRead);
}

buffer.flush();

return buffer.toByteArray();

393
2017-08-12 07:30



Finalmente, después de veinte años, hay una solución simple sin la necesidad de una biblioteca de terceros, gracias a Java 9:

InputStream is;
…
byte[] array = is.readAllBytes();

Tenga en cuenta también los métodos de conveniencia readNBytes(byte[] b, int off, int len) y transferTo(OutputStream) abordar las necesidades recurrentes.


181
2018-06-07 13:50



Si usas google guayaba, será tan simple como:

byte[] bytes = ByteStreams.toByteArray(inputStream);

107
2018-05-04 10:37



Use los Java de vanilla DataInputStream y es readFully Método (existe desde al menos Java 1.4):

...
byte[] imgDataBa = new byte[(int)imgFile.length()];
DataInputStream dataIs = new DataInputStream(new FileInputStream(imgFile));
dataIs.readFully(imgDataBa);
...

Hay otros sabores de este método, pero lo uso todo el tiempo para este caso de uso.


98
2018-01-25 14:31



public static byte[] getBytesFromInputStream(InputStream is) throws IOException {
    ByteArrayOutputStream os = new ByteArrayOutputStream(); 
    byte[] buffer = new byte[0xFFFF];
    for (int len = is.read(buffer); len != -1; len = is.read(buffer)) { 
        os.write(buffer, 0, len);
    }
    return os.toByteArray();
}

32
2017-07-25 14:33



¿Realmente necesitas la imagen como una byte[]? ¿Qué esperas exactamente en el byte[] - el contenido completo de un archivo de imagen, codificado en cualquier formato en el que esté el archivo de imagen, o valores de píxel RGB?

Otras respuestas aquí le muestran cómo leer un archivo en un byte[]. Tu byte[] contendrá el contenido exacto del archivo, y necesitaría decodificar eso para hacer cualquier cosa con los datos de la imagen.

La API estándar de Java para leer (y escribir) imágenes es la API de ImageIO, que puedes encontrar en el paquete javax.imageio. Puede leer una imagen de un archivo con solo una línea de código:

BufferedImage image = ImageIO.read(new File("image.jpg"));

Esto te dará una BufferedImage, No un byte[]. Para ver los datos de la imagen, puede llamar getRaster() sobre el BufferedImage. Esto te dará una Raster objeto, que tiene métodos para acceder a los datos de píxeles (tiene varios getPixel() / getPixels() métodos).

Busque la documentación de API para javax.imageio.ImageIO, java.awt.image.BufferedImage, java.awt.image.Raster etc.

ImageIO admite varios formatos de imagen de forma predeterminada: JPEG, PNG, BMP, WBMP y GIF. Es posible agregar soporte para más formatos (necesitaría un complemento que implemente la interfaz del proveedor de servicios ImageIO).

Ver también el siguiente tutorial: Trabajando con Imágenes


19
2017-08-12 08:14



Como siempre, también Marco de primavera (spring-core desde 3.2.2) tiene algo para ti: StreamUtils.copyToByteArray()


19
2018-04-18 13:59



Si no desea utilizar la biblioteca Apache commons-io, este fragmento se toma de la clase sun.misc.IOUtils. Es casi el doble de rápido que la implementación común con ByteBuffers:

public static byte[] readFully(InputStream is, int length, boolean readAll)
        throws IOException {
    byte[] output = {};
    if (length == -1) length = Integer.MAX_VALUE;
    int pos = 0;
    while (pos < length) {
        int bytesToRead;
        if (pos >= output.length) { // Only expand when there's no room
            bytesToRead = Math.min(length - pos, output.length + 1024);
            if (output.length < pos + bytesToRead) {
                output = Arrays.copyOf(output, pos + bytesToRead);
            }
        } else {
            bytesToRead = output.length - pos;
        }
        int cc = is.read(output, pos, bytesToRead);
        if (cc < 0) {
            if (readAll && length != Integer.MAX_VALUE) {
                throw new EOFException("Detect premature EOF");
            } else {
                if (output.length != pos) {
                    output = Arrays.copyOf(output, pos);
                }
                break;
            }
        }
        pos += cc;
    }
    return output;
}

13
2017-09-17 14:04