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

cla*_*amp 5 java streaming zip http

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

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

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

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

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

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

Ant*_*era 5

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

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

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

另请参阅http://en.wikipedia.org/wiki/HTTP_compression

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


Boh*_*ian 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();
}
Run Code Online (Sandbox Code Playgroud)

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


Paŭ*_*ann 5

Java支持gzipGZipInputStream(解压缩)和GZipOutputStream(压缩)的格式。两者在内部都使用相同的压缩格式,主要区别在于元数据:它位于文件的末尾、开头(并且仅轻松zip支持一个封闭的文件)。gzipzipgzipgzip

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

我不确定如果服务器使用 传递内容,HTTPConnection 是否会Accept-Encoding: gzip发送并自动处理内容膨胀,但如果服务器只是发送文件本身(即使用) Content-Encoding: gzip,您肯定可以手动执行此操作。.gzContent-Encoding: identity

(顺便说一句,请确保从流中读取的缓冲区不要太小,因为每个 deflate 调用都会产生本机调用开销,因为 Java 的 GZipInputStream 使用本机zlib实现。)