Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:通过HTTP传输Zipfile的内容_Java_Http_Streaming_Zip - Fatal编程技术网

Java:通过HTTP传输Zipfile的内容

Java:通过HTTP传输Zipfile的内容,java,http,streaming,zip,Java,Http,Streaming,Zip,我有相当数量的可流化数据(>100MB),为了压缩,我想在http服务器上的zipfile中存储这些数据。所以这个zipfile包含一个文件 现在,java客户机是否可以通过http传输数据,即使数据打包在zipfile中 根据维基百科,拉链不是按顺序排列的 如果这在某种程度上仍然是可能的,那么如何实现呢 编辑:关于gzip:正如我所说,我使用一个自定义java客户机(不是webbrowser)java http实现中是否有gzip?是的,您可以流式传输zip,并使用MIME类型作为应用程序/

我有相当数量的可流化数据(>100MB),为了压缩,我想在http服务器上的zipfile中存储这些数据。所以这个zipfile包含一个文件

现在,java客户机是否可以通过http传输数据,即使数据打包在zipfile中

根据维基百科,拉链不是按顺序排列的

如果这在某种程度上仍然是可能的,那么如何实现呢


编辑:关于gzip:正如我所说,我使用一个自定义java客户机(不是webbrowser)java http实现中是否有gzip?

是的,您可以流式传输zip,并使用MIME类型作为应用程序/zip

如果您真的想在另一端播放流音乐,那么这不能简单地完成,因为您只能在客户端上打开整个压缩包


如果您关心大小,您可以降低mp3比特率或使用ogg/vorbis等格式,让web服务器进行压缩是否更有意义?如果您只是想减少所使用的带宽,而不是真的想将压缩后的文件存储在服务器上,那么这只是一个配置问题,例如,请参见:

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

另见

客户端将接收压缩包并处理解压缩。也应该可以对文件进行流式处理,这样客户端在做一些有用的事情之前就不需要所有文件,因为服务器可以压缩各个块。

以下是一段代码片段(有效),客户端可以使用它从压缩的流中读取:

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的主要区别在于对条目进行迭代。例如,您可能知道您想要第一个条目,因此不需要名称匹配参数等。

使用GZIP,然后您就可以进行流式处理。Gzip仍然使用默认的压缩算法zip。

Java支持
Gzip
格式以及
Gzip输入流
(解压缩)和
Gzip输出流
(压缩)。
zip
gzip
在内部使用相同的压缩格式,主要区别在于元数据:
zip
将其放在文件的末尾,
gzip
放在文件的开头(并且
gzip
只支持一个封闭的文件)

对于一个大文件的流式传输,使用
gzip
将是更好的选择,因为您不需要访问元数据

我不确定HTTPConnection是否发送
Accept Encoding:gzip
,然后在服务器使用
content Encoding:gzip
交付内容时自动处理内容膨胀,但如果服务器只发送
.gz
文件(即使用
内容编码:identity
),您肯定可以手动执行此操作


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

您确定吗,因为此图显示它不可流化:@clamp:您可以流化它,但在客户端收到文件的全部内容之前,您无法将其解包。(这就是图片/文章所描述的)好吧,但这正是我想要的。文件的内容就是我想要流的内容。@为什么不使用较低的比特率或像ogg@suraj,这不是一个音频文件,它是一个自定义数据。您指的是在zip文件中单独传输文件,而不是整个zip文件,对吗?实际上zipfile只包含一个文件。我同意@Ant的基本观点——如果你只有一个文件,就使用直接压缩而不是压缩存档。文件可以在服务器上压缩,也可以不压缩,这是您喜欢的。您没有遇到问题。如果你压缩文件,然后在另一端解压,你需要整个压缩文件。因此,如果zip中的数据部分位于客户端上,则无法使用zip中的数据。因此,基本上,即使zip文件本身正在流化,音频本身也不会。我相信解决方案是使用低比特率或更好的流媒体formats@Suraj如果单个块已压缩,则不存在问题。但确实,您需要检查如果将传输编码分块与GZIP压缩一起使用会发生什么。潜在地,您需要只使用分块传输编码,自己压缩分块并在客户机上解压,这很混乱!如果不尝试的话,我真的不知道它到底是如何工作的,但是我假设每个块都会被gzip压缩。如果有人试过,请告诉我似乎建议gzip使用流(你不需要整个东西来开始解压)。。。所以我想这是可行的。试试看:-)正如我所说,zipfile只包含一个条目。不幸的是,关于这一点的元信息似乎在zipfile的最后,所以我需要下载整个文件,然后才能开始解压缩,对吗?不-条目是按名称然后按内容出现的,所以您可以直接获得条目标题谢谢,但是这个gzip在JavaHTTP实现中可用吗?当然,只需发送一个gzip流,并在服务器端将该流存储到磁盘。您只需包装当前流。gzipstream是POST或PUT中的封闭实体