2010-02-02 50 views
6

用户上传一个大文件到我的网站,我想gzip该文件并将其存储在一个blob中。所以我有一个未压缩的InputStream,blob需要一个InputStream。我知道如何使用GZIPOutputStream将InputStream压缩到Outputstream,但是如何从gzip处理的OutputStream返回到blob所需的InputStream。如何将未压缩的InputStream有效地转换为gzip的InputStream?

我能找到的唯一方法就是使用ByteArrayOutputStream,然后使用toByteArray创建一个新的InputStream。但是这意味着我在内存中拥有整个文件副本。如果JDBC驱动程序实现将流转换为byte []也不会让我感到惊讶,所以我在内存中有两个副本。

+0

如果您不希望整个文件在内存中,然后写入文件。我看到它的方式gzip的数据需要去某个地方。 – 2010-02-02 18:27:36

+0

我希望能够直接流入blob,所以我从来不需要在整个内存中记录整个内容。它看起来是行不通的,因为我需要知道设置blob参数时的长度。我想在技术上,我可以流式传输到一个文件,获得文件的大小,然后将它用作输入流回到blob中,所以我永远不需要将整个内容保存在内存中。在这种情况下,我基本上会使用文件系统作为我的记忆,这可能最终会变得有用。 – 2010-02-02 19:35:07

回答

4

如果你使用的是java 1.6,你可以使用java.util.zip.DeflaterInputStream。据我所知,这正是你想要的。如果你不能使用1.6,你应该能够使用java.util.zip.Deflater重新实现DeflaterInputStream。当从BLOB读回数据时,使用InflaterInputStream作为过滤器来获取原始数据。

+0

我不知道那个班。这看起来像是正确的解决方案。不幸的是,Blob实现使用长度,而DeflaterInputStream总是返回0或1.我认为我需要这个长度的事实意味着无论如何,我都无法将数据直接压缩并传输到blob,因为直到压缩完成才能知道长度。 – 2010-02-02 19:30:41

+0

@Brian所以你在创建blob时需要传递一个长度以及输入流? InputStream没有长度方法,只有一个可用的方法意味着与流的长度完全不同。 – 2010-02-02 19:53:50

+0

available()似乎在原始输入流(它来自http post)上返回正确的长度。也许它是基于内容长度的,也可能是在我得到它之前在上游某个地方读取整个流。但是一旦我压缩它就没有什么帮助,因为直到我已经处理完整个流之前,我不会知道压缩的大小,此时它在内存中,所以我不妨将它转换为byte []。 – 2010-02-02 23:50:03

相关问题