Java:通过HTTP流式传输Zipfile的内容

时间:2011-06-03 09:48:07

标签: java http streaming zip

我有相当多的可流式数据(> 100MB),为了压缩,我想在http服务器上托管一个zipfile。所以这个zipfile包含一个文件。

现在java客户端可以通过http流式传输数据,即使它是打包在zipfile中的吗?

根据维基百科,ZIP不是顺序的......

http://en.wikipedia.org/wiki/ZIP_(file_format)#Structure

如果仍然可能以某种方式,那么如何?

编辑:关于gzip:正如我所说的,我使用自定义java客户端(不是webbrowser)是在java http实现中可用的gzip吗?

5 个答案:

答案 0 :(得分:5)

以下是客户端可用于从压缩流中读取的代码片段(可行):

static void processZippedInputStream(InputStream in, String entryNameRegex)
throws IOException
{
    ZipInputStream zin = new ZipInputStream(in);
    ZipEntry ze;
    while ((ze = zin.getNextEntry()) != null)
    {
        if (ze.getName().matches(entryNameRegex))
        {
            // treat zin as a normal input stream - ie read() from it till "empty" etc
            break;
        }
        zin.closeEntry();
    }
    zin.close();
}

与普通InputStream的主要区别在于遍历条目。例如,您可能知道您想要第一个条目,因此不需要名称匹配参数等。

答案 1 :(得分:4)

让网络服务器进行压缩是否更有意义?如果您只是想减少使用的带宽量,而不是真正想要将文件压缩存储在服务器上,这只是配置问题,例如:

http://tomcat.apache.org/tomcat-5.5-doc/config/http.html

用于HTTP / 1.1 GZIP压缩。服务器可以强制对客户端的响应进行压缩。

另见http://en.wikipedia.org/wiki/HTTP_compression

客户端将收到压缩包并处理解压缩。也应该可以流式传输文件,因此客户端不需要所有文件才能执行有用的操作,因为服务器可以压缩单个块。

答案 2 :(得分:4)

Java支持带有gzip(解压缩)和GZipInputStream(压缩)的GZipOutputStream格式。 zipgzip都在内部使用相同的压缩格式,主要区别在于元数据:zip在文件末尾有{(1}}开头({1}}并且gzip只能轻松支持一个封闭的文件。

对于流式传输一个大文件,使用gzip将是更好的事情 - 甚至更多,因为您不需要访问元数据。

我不确定HTTPConnection是否发送gzip,然后如果服务器使用Accept-Encoding: gzip传送内容,则自动处理内容膨胀,但如果服务器只是发送了一个,你肯定可以手动执行Content-Encoding: gzip这样的文件(即使用.gz)。

(顺便说一下,确保从流中读取缓冲区不太小,因为每个deflate调用都会有本机调用开销,因为Java的GZipInputStream使用本机 zlib 实现。)< / p>

答案 3 :(得分:2)

是的,你可以,流式传输zip并使用MIME类型 application / zip

如果你真的想在另一端播放流音乐,那么就不能轻易完成,因为只有在客户端提供整个zip后才能解压缩。

如果您关注尺寸,可以调低mp3比特率或使用ogg / vorbis等格式

答案 4 :(得分:0)

使用GZIP,然后您可以流式传输。无论如何,Gzip使用zip的默认压缩算法。