java - example - bytearrayoutputstream to outputstream
Byte[] a InputStream o OutputStream (7)
Me doy cuenta de que mi respuesta es muy tarde para esta pregunta, pero creo que a la comunidad le gustaría un enfoque más nuevo sobre este tema .
Tengo una columna blob en la tabla de mi base de datos, para lo cual tengo que usar byte[]
en mi programa Java como mapeo y para usar esta información tengo que 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?
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.
Puede crear y usar 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();
Suponiendo que está utilizando un controlador JDBC que implementa la interfaz estándar Blob JDBC (no todo lo hace), también puede conectar un InputStream
o OutputStream
a un blob utilizando los métodos getBinaryStream
y setBinaryStream
1 , y también puede obtener y configurar los bytes directamente .
(En general, debe tomar los pasos adecuados para manejar excepciones y cerrar transmisiones. Sin embargo, cerrar bis
y bos
en el ejemplo anterior es innecesario, ya que no están asociados con ningún recurso externo, por ejemplo, descriptores de archivos, conectores, conexiones de bases de datos .)
1 - El método setBinaryStream
es realmente un getter. Imagínate.
Supongo que quiere decir que "usar" significa leer, pero lo que explicaré para el caso de lectura puede invertirse básicamente para el caso de escritura.
así que terminas 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.
entonces podrías crear un FileOutputStream para el archivo que deseas crear. hay muchos tipos de InputStreams y OutputStreams para diferentes fuentes de datos y destinos.
por último, escribirías el InputStream en el OutputStream. en este caso, la matriz de bytes se enviaría en secuencia al 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 en reversa
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, necesitará manejar las excepciones y le recomiendo que haga los ''cierres'' en un bloque finally.
podemos convertir la matriz byte [] en la corriente de entrada usando ByteArrayInputStream
String str = "Welcome to awesome Java World";
byte[] content = str.getBytes();
int size = content.length;
InputStream is = null;
byte[] b = new byte[size];
is = new ByteArrayInputStream(content);
Para ver un ejemplo completo, consulte aquí http://www.onlinecodegeek.com/2015/09/how-to-convert-byte-into-inputstream.html
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.
output = new ByteArrayOutputStream();
...
input = new ByteArrayInputStream( output.toByteArray() )