Estoy trabajando en una aplicación web java en la que los archivos se almacenarán en una base de datos. Originalmente se recuperaron los archivos que ya están en la base de datos, simplemente llamando a getBytes
en nuestro conjunto de resultados:Cómo convertir un InputStream a un DataHandler?
byte[] bytes = resultSet.getBytes(1);
...
Esta matriz de bytes se convierte entonces en un DataHandler
utilizando el constructor obvia:
dataHandler=new DataHandler(bytes,"application/octet-stream");
Esto funcionó muy bien hasta que nos comenzó a tratar de almacenar y recuperar archivos más grandes. Volcar todo el contenido del archivo en una matriz de bytes y luego crear un DataHandler
simplemente requiere demasiada memoria.
Mi idea inmediata es recuperar una secuencia de los datos en la base de datos con getBinaryStream
y de alguna manera convertir ese InputStream
en un de una manera eficiente con la memoria. Desafortunadamente, no parece que haya una forma directa de convertir un InputStream
en un DataHandler
. Otra idea con la que he estado jugando es leer trozos de datos del InputStream
y escribirlos en el OutputStream
del DataHandler
. Pero ... No puedo encontrar una forma de crear un DataHandler
"vacío" que devuelva un OutputStream
no nulo cuando llamo a getOutputStream
...
¿Alguien ha hecho esto? Agradecería cualquier ayuda que pueda darme o me guiará en la dirección correcta.
Ah, que es una gran idea. Lo intentaré cuando tenga oportunidad. – pcorey
Pensé lo mismo. Pero ten cuidado, entonces el DataHandler debe ser usado (consume su entrada), "dentro de ti loop", mientras que el ResultSet está abierto. Por ejemplo, probablemente no puede pasar el objeto DataHandler a una capa superior. – leonbloy
@leonbloy El objetivo declarado era procesar los datos sin copiarlos del conjunto de resultados. Esto implica que el conjunto de resultados debe estar abierto todo el tiempo, independientemente de cómo lo haga. –