2010-01-19 30 views
106

Tengo una columna 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 debo convertirla a InputStream o OutputStream. Pero no sé qué sucede internamente cuando lo hago. ¿Alguien puede explicarme brevemente qué sucede cuando realizo esta conversión?Byte [] a InputStream o OutputStream

+2

¿No debería ser el título de "matriz de bytes ... "o" byte array ... "o" byte [] ... "instaed of" byte of array ... "? – kuester2000

+1

Vea el reverso aquí: http://stackoverflow.com/questions/1264709/convert-inputstream-to-byte-in-java –

Respuesta

167

a crear y matriz uso de bytes de E/S arroyos 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(); 

Suponiendo que está utilizando un controlador JDBC que implementa el estándar JDBC Blob interface (no todos lo hacen), puede también conectar una InputStream o OutputStream a un blob utilizando los métodos getBinaryStream y setBinaryStream , y también puede obtener y configurar los bytes directamente.

(En general, usted debe tomar las medidas apropiadas para manejar las excepciones y arroyos cercanos Sin embargo, el cierre de bis y bos en el ejemplo anterior no es necesario, ya que no están asociados con los recursos externos;. Ej descriptores de fichero, enchufes, conexiones de base de datos.)

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

+1

bueno ... muy útil –

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 como están.

Debe realizarse una conversión cuando desee pasar de un byte a un char. Entonces necesitas convertir usando un conjunto de caracteres. Esto ocurre cuando crea Cadena o Lector a partir de bytes, que están hechos para datos de caracteres.

+0

+1 - Iba a responder esa parte de la pregunta, pero me puse ocupado :-) –

12

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

por lo que termina con un byte []. esto podría representar cualquier tipo de datos que puedan necesitar tipos especiales de conversiones (caracteres, encriptados, etc.). imaginemos que quiere escribir esta información como está 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.

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

por último, escribiría el InputStream en el OutputStream. en este caso, la matriz de bytes se enviaría en secuencia al FileOutputStream para su escritura. Para ello recomiendo el uso de 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 utiliza los trozos de código que necesita para manejar excepciones y te recomiendo que la 'cierra' en un bloque finally .

+0

¿No quisiste decir - ByteArrayOutputStream out = new ByteArrayOutputStream(); en su lugar ByteArrayOutputStream out = new ByteArrayInputStream(); –

+0

sí oops ....... – pstanton

+0

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

0

Me doy cuenta de que mi respuesta es muy tarde para esta pregunta, pero creo que a la comunidad le gustaría a newer approach to this issue.

+0

Los búferes circulares no resuelven el problema del OP. En la Pregunta tal como está escrita, el OP necesita el contenido * completo * en una única matriz de bytes. –

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

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

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