Java:通过HTTP流式传输Zipfile的内容
我有相当多的可流传输数据(> 100MB),为了压缩,我想在http服务器上托管一个zipfile。 所以这个zipfile包含一个文件。
现在有可能java-client通过http流式传输数据,即使它是打包在zipfile中的吗?
根据维基百科,ZIP不是顺序…
http://en.wikipedia.org/wiki/ZIP_(file_format)#Structure
如果这仍然可能以某种方式,那么如何?
编辑:关于gzip:正如我所说,我使用自定义的Java客户端(不是webbrowser)是java http实现中的gzip吗?
Java支持使用GZipInputStream
(解压缩)和GZipOutputStream
(压缩)的gzip
格式。 zip
和gzip
在内部使用相同的压缩格式,主要区别在于元数据: zip
在文件末尾有gzip
, gzip
在开头( gzip
只支持一个封闭的文件)。
对于流式传输一个大文件,使用gzip
将是更好的事情 – 甚至更多,因为您不需要访问元数据。
我不确定HTTPConnection是否发送Accept-Encoding: gzip
,然后如果服务器通过Content-Encoding: gzip
传递内容,则自动处理内容,但如果服务器只是发送.gz
文件,你肯定可以手动执行因此(即使用Content-Encoding: identity
)。
(顺便说一句,确保从流中读取缓冲区不太小,因为每个deflate调用都会有本机调用开销,因为Java的GZipInputStream使用本机zlib实现。)
以下是客户端可用于从压缩流中读取的代码片段(可行):
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的主要区别在于遍历条目。 例如,您可能知道您想要第一个条目,因此不需要名称匹配参数等。
让网络服务器进行压缩是否更有意义? 如果您只是想减少使用的带宽量,而不是真的想要将压缩文件存储在服务器上,这只是配置问题,例如:
http://tomcat.apache.org/tomcat-5.5-doc/config/http.html
用于HTTP / 1.1 GZIP压缩。 服务器可以强制对客户端的响应进行压缩。
另见http://en.wikipedia.org/wiki/HTTP_compression 。
客户端将收到压缩包并处理解压缩。 应该也可以流式传输文件,因此客户端在它可以做一些有用的事情之前不需要所有文件,因为服务器可以压缩单个块。
是的,你可以,流式传输zip并使用MIME类型作为应用程序/ zip
如果你真的想在另一端播放流音乐,那么它就不能轻易完成,因为你只能在客户端上提供整个zip后解压缩。
如果您关心大小,可以调低mp3比特率或使用ogg / vorbis等格式
使用GZIP然后您可以流式传输。 Gzip无论如何都使用zip的默认压缩算法。