Convierta InputStream en una matriz de bytes en Java

5 minutos de lectura

Convierta InputStream en una matriz de bytes en Java
JGC

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

  • Ver el reverso: byte[] a InputStream aquí: stackoverflow.com/questions/2091454/…

    – David d C y Freitas

    22 de septiembre de 2011 a las 10:34

Convierta InputStream en una matriz de bytes en Java
adamski

Necesitas leer cada byte de tu InputStream y escríbelo a un ByteArrayOutputStream.

A continuación, puede recuperar la matriz de bytes subyacente llamando toByteArray():

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);
}

return buffer.toByteArray();

  • ¿Qué pasa con el tamaño del byte recién creado?[]. ¿Por qué es 16384? ¿Cómo podría determinar el tamaño correcto exacto? Muchas gracias.

    – Ondrej Bozek

    3 de abril de 2012 a las 9:45

  • 16384 es una elección bastante arbitraria, aunque tiendo a favorecer las potencias de 2 para aumentar la posibilidad de que la matriz se alinee con los límites de las palabras. La respuesta de pihentagy muestra cómo puede evitar el uso de un búfer intermedio, sino asignar una matriz del tamaño correcto. A menos que esté tratando con archivos grandes, personalmente prefiero el código anterior, que es más elegante y se puede usar para InputStreams donde la cantidad de bytes para leer no se conoce de antemano.

    – Adamski

    3 de abril de 2012 a las 11:33


  • @Adamski ¿No está creando una matriz de bytes mucho más grande de lo que espera que haya datos en la secuencia, desperdicie la memoria?

    –Paul Brewczynski

    29 de junio de 2013 a las 16:38

  • @bluesm: Sí, eso es correcto. Sin embargo, en mi ejemplo, la matriz de bytes tiene solo 16 Kb y es muy pequeña para los estándares actuales. Además, por supuesto, esta memoria se liberará nuevamente después.

    – Adamski

    4 de julio de 2013 a las 7:36

  • @Adamski Una gran cantidad de hardware de infraestructura, servidores web y componentes de la capa del sistema operativo utilizan búferes de 4K para mover datos, por lo que esa es la razón del número exacto, pero el punto principal es que obtienes un aumento de rendimiento tan pequeño al pasar 4K que generalmente se considera un desperdicio de memoria. asumo que esto es todavía cierto, ¡porque es un conocimiento de hace una década que tenía!

    usuario2080225

    30 de marzo de 2017 a las 14:14

  • Documentación de Java “Tenga en cuenta que este método está diseñado para casos simples en los que es conveniente leer todos los bytes en una matriz de bytes. No está diseñado para leer flujos de entrada con grandes cantidades de datos”. y, de hecho, estaba limitado a 8192 de mi prueba (sin documentar) Úselo para la prueba, pero no en producción.

    – pdem

    17 de diciembre de 2021 a las 14:52

  • @pdem no existe tal límite. Acabo de verificarlo leyendo un archivo de 2GiB en la memoria. Funciona, siempre que se pueda asignar una matriz apropiadamente grande. Si obtiene resultados diferentes, es un problema de su configuración de prueba. El punto que tu no debe leer archivos tan grandes en la memoria, pero preferir procesarlos mientras se lee, es algo completamente diferente. Obviamente, se aplica a todas las soluciones presentadas en las preguntas y respuestas, ya que todas tratan de leer un archivo completo en la memoria.

    – Holger

    17 dic 2021 a las 15:04


  • Bueno, eres muy reactivo, probé 2 jdk (11 17) y funciona con un byteInputstream grande como dijiste, así que supongo que hay un problema con may api con javamail: obtengo archivos de un contenido de mimemessage. Lo extraño es que el error relacionado con javamail no aparece con una lectura de manual clásica.

    – pdem

    17 dic 2021 a las 15:21

  • ¿Esto es específico? InputStream anular readAllBytes() o readNBytes?

    – Holger

    17 de diciembre de 2021 a las 15:28

  • Suena como si valiera la pena una pregunta por sí solo.

    – Holger

    20 de diciembre de 2021 a las 8:34

1646963049 693 Convierta InputStream en una matriz de bytes en Java
dermoritz

Usa vainilla de Java DataInputStream y es readFully Método (existe desde al menos Java 1.4):

...
byte[] bytes = new byte[(int) file.length()];
DataInputStream dis = new DataInputStream(new FileInputStream(file));
dis.readFully(bytes);
...

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

  • +1 por usar las bibliotecas estándar en lugar de una dependencia de terceros. Desafortunadamente, no funciona para mí porque no sé la duración de la transmisión por adelantado.

    – Andrés Spencer

    7 de junio de 2012 a las 9:28

  • @janus es un “Archivo”. de esta manera solo funciona si conoce la longitud del archivo o la cantidad de bytes para leer.

    – dermoritz

    28 de julio de 2013 a las 9:49

  • Cosa interesante, pero debe saber la longitud exacta de la secuencia (parte de la) para leer. Además, la clase DataInputStream se usa principalmente para leer tipos primarios (Largos, Cortos, Chars…) de una secuencia, por lo que podemos ver este uso como un mal uso de la clase.

    –Olivier Faucheux

    08/04/2015 a las 11:51


  • Si ya conoce la longitud de los datos para leer de la secuencia, esto no es mejor que InputStream.read.

    – Camioneta Logan

    12 de octubre de 2016 a las 3:57

  • ¡@LoganPickup InputStream.read no garantiza devolver todos los bytes que solicita!

    – Ray Hulha

    15 de octubre de 2018 a las 3:32


1646963049 454 Convierta InputStream en una matriz de bytes en Java
Joaquín Sauer

Si por casualidad usas Google guayabaserá tan simple como usar ByteStreams:

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

  • +1 por usar las bibliotecas estándar en lugar de una dependencia de terceros. Desafortunadamente, no funciona para mí porque no sé la duración de la transmisión por adelantado.

    – Andrés Spencer

    7 de junio de 2012 a las 9:28

  • @janus es un “Archivo”. de esta manera solo funciona si conoce la longitud del archivo o la cantidad de bytes para leer.

    – dermoritz

    28 de julio de 2013 a las 9:49

  • Cosa interesante, pero debe saber la longitud exacta de la secuencia (parte de la) para leer. Además, la clase DataInputStream se usa principalmente para leer tipos primarios (Largos, Cortos, Chars…) de una secuencia, por lo que podemos ver este uso como un mal uso de la clase.

    –Olivier Faucheux

    08/04/2015 a las 11:51


  • Si ya conoce la longitud de los datos para leer de la secuencia, esto no es mejor que InputStream.read.

    – Camioneta Logan

    12 de octubre de 2016 a las 3:57

  • ¡@LoganPickup InputStream.read no garantiza devolver todos los bytes que solicita!

    – Ray Hulha

    15 de octubre de 2018 a las 3:32


Convierta InputStream en una matriz de bytes en Java
Arne Burmeister

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

  • Como la mayoría de los demás, quería evitar el uso de una biblioteca de terceros para algo tan simple, pero Java 9 no es una opción en este momento… afortunadamente, ya estaba usando Spring.

    – scottysseus

    15/10/2018 a las 21:54

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad