Как я могу эффективно преобразовать несжатый InputStream в gzip'ed InputStream? - PullRequest
6 голосов
/ 02 февраля 2010

Пользователь загружает большой файл на мой сайт, и я хочу сжать файл и сохранить его в BLOB-объекте. Таким образом, у меня есть несжатый InputStream и BLOB-объект хочет InputStream. Я знаю, как сжимать InputStream в Outputstream с помощью GZIPOutputStream, но как мне перейти от gzip'ed OutputStream обратно к InputStream, необходимому для большого двоичного объекта.

Единственный способ, который я смог найти, - это использование ByteArrayOutputStream, а затем создание нового InputStream с использованием toByteArray. Но это будет означать, что у меня есть полная копия файла в памяти. И меня не удивит, если реализация драйвера JDBC преобразует поток в байт [], так что у меня будет две копии в памяти.

1 Ответ

4 голосов
/ 02 февраля 2010

Если вы используете Java 1.6, вы можете использовать java.util.zip.DeflaterInputStream. Насколько я могу судить, это именно то, что вы хотите. Если вы не можете использовать 1.6, вы сможете переопределить DeflaterInputStream, используя java.util.zip.Deflater. При чтении данных с BLOB используйте InflaterInputStream в качестве фильтра, чтобы получить исходные данные.

...