Byte [] a InputStream o OutputStream


129

Tengo una columna de blob en la tabla de mi base de datos, para la cual tengo que usar byte[]en mi programa Java como mapeo y para usar esta información tengo que convertirla en InputStreamo OutputStream. Pero no sé qué sucede internamente cuando lo hago. ¿Alguien puede explicarme brevemente qué sucede cuando hago esta conversión?


2
¿No debería ser el título "matriz de bytes ..." o "matriz de bytes ..." o "byte [] ..." en lugar de "byte de matriz ..."?
kuester2000

Respuestas:


198

Puede crear y utilizar secuencias de E / S de matriz de bytes de la siguiente manera:

byte[] source = ...;
ByteArrayInputStream bis = new ByteArrayInputStream(source);
// read bytes from bis ...

ByteArrayOutputStream bos = new ByteArrayOutputStream();
// write bytes to bos ...
byte[] sink = bos.toByteArray();

Asumiendo que usted está utilizando un controlador JDBC que implementa el estándar de interfaz JDBC Blob (no todos lo hacen), puede también conectar una InputStreamo OutputStreama una burbuja con el getBinaryStreamy setBinaryStreammétodos 1 , y también se puede obtener y establecer los bytes directamente.

(En general, debe tomar los pasos apropiados para manejar cualquier excepción y cerrar las secuencias. Sin embargo, cerrar bisy bosen el ejemplo anterior es innecesario, ya que no están asociados con ningún recurso externo; por ejemplo, descriptores de archivos, sockets, conexiones de bases de datos).

1 - El setBinaryStreammétodo es realmente un captador. Imagínate.


13

Supongo que quiere decir que 'usar' significa leer, pero lo que explicaré para el caso de lectura se puede revertir básicamente para el caso de escritura.

entonces terminas con un byte []. Esto podría representar cualquier tipo de datos que puedan necesitar tipos especiales de conversiones (caracteres, cifrados, etc.). Supongamos que desea escribir estos datos tal como están en un archivo.

En primer lugar, podría crear un ByteArrayInputStream que es básicamente un mecanismo para suministrar los bytes a algo en secuencia.

entonces podría crear un FileOutputStream para el archivo que desea crear. Existen muchos tipos de InputStreams y OutputStreams para diferentes fuentes de datos y destinos.

Por último, escribiría InputStream en OutputStream. en este caso, la matriz de bytes se enviaría en secuencia a FileOutputStream para su escritura. Para esto recomiendo usar IOUtils

byte[] bytes = ...;//
ByteArrayInputStream in = new ByteArrayInputStream(bytes);
FileOutputStream out = new FileOutputStream(new File(...));
IOUtils.copy(in, out);
IOUtils.closeQuietly(in);
IOUtils.closeQuietly(out);

y a la inversa

FileInputStream in = new FileInputStream(new File(...));
ByteArrayOutputStream out = new ByteArrayOutputStream();
IOUtils.copy(in, out);
IOUtils.closeQuietly(in);
IOUtils.closeQuietly(out);
byte[] bytes = out.toByteArray();

si usa los fragmentos de código anteriores, deberá manejar las excepciones y le recomiendo que haga los 'cierres' en un bloque finalmente.


¿no quiso decir? ByteArrayOutputStream out = new ByteArrayOutputStream (); en cambio ByteArrayOutputStream out = new ByteArrayInputStream ();
Avihai Marchiano

CloseQuietly probablemente debería estar en una cláusula final.
JustinKSU


4

No hay conversión entre InputStream / OutputStream y los bytes con los que están trabajando. Están hechos para datos binarios, y solo leen (o escriben) los bytes uno por uno tal como están.

Una conversión debe suceder cuando desea pasar de byte a char. Entonces necesitas convertir usando un juego de caracteres. Esto sucede cuando crea String o Reader a partir de bytes, que están hechos para datos de caracteres.


1
output = new ByteArrayOutputStream();
...
input = new ByteArrayInputStream( output.toByteArray() )

0

Me doy cuenta de que mi respuesta llega tarde a esta pregunta, pero creo que a la comunidad le gustaría un enfoque más nuevo sobre este tema .


Los amortiguadores circulares no resuelven el problema del OP. En la Pregunta tal como está escrita, el OP necesita todo el contenido en una sola matriz de bytes.
Stephen C

0
byte[] data = dbEntity.getBlobData();
response.getOutputStream().write();

Creo que esto es mejor ya que ya tiene un OutputStream existente en el objeto de respuesta. no es necesario crear un nuevo OutputStream.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.