I'm working on a Java web application in which files will be stored in a database. Originally, we retrieved files already in the DB by simply calling getBytes
on our result set:
byte[] bytes = resultSet.getBytes(1);
...
This byte array was then converted into a DataHandler
using the obvious constructor:
dataHandler = new DataHandler(bytes, "application/octet-stream");
This worked great until we started trying to store and retrieve larger files. Dumping the entire file contents into a byte array and then building a DataHandler
out of that simply requires too much memory.
My immediate idea is to retrieve a stream of the data in the database with getBinaryStream
and somehow convert that InputStream
into a DataHandler
in a memory-efficient way. Unfortunately it doesn't seem like there's a direct way to convert an InputStream
into a DataHandler
. Another idea I've been playing with is reading chunks of data from the InputStream
and writing them to the OutputStream
of the DataHandler
. But... I can't find a way to create an "empty" DataHandler
that returns a non-null OutputStream
when I call getOutputStream
...
Has anyone done this? I'd appreciate any help you can give me or leads in the right direction.
My approach would be to write a custom class implementing DataSource
that wraps your InputStream
. Then create the DataHandler
giving it the created DataSource
.