你的循环看起来很有效 – 下面的代码(就是它自己的)返回什么?
zipStream.read(tempBuffer)
如果它返回-1,那么zipStream在你得到之前是关闭的,所有的赌注都是关闭的.现在是时候使用你的调试器,并确保传递给你的是真的有效.
当您调用getNextEntry()时,它是否返回一个值,并且该条目中的数据有意义(即getCompressedSize()是否返回有效值)?如果您正在阅读一个Zip文件,该文件没有嵌入预览的zip文件,那么ZipInputStream将无法为您服务.
有关Zip格式的一些有用的信息:
嵌入在zip文件中的每个文件都有一个标题.此标题可以包含有用的信息(例如流的压缩长度,它在文件中的偏移量,CRC) – 或者它可以包含一些基本上称为“信息不在流标题中的魔术值,您必须检查邮编后缀“.
每个zip文件都有一个附加到包含所有zip条目的文件末尾的表以及实际数据.最后的表格是强制性的,其中的值必须正确.相反,不需要提供嵌入流中的值.
如果您使用ZipFile,它会在zip的末尾读取表格.如果您使用ZipInputStream,我怀疑getNextEntry()尝试使用嵌入在流中的条目.如果没有指定这些值,则ZipInputStream不知道流可能有多长.膨胀算法是自我终止的(您实际上不需要知道输出流的未压缩长度才能完全恢复输出),但是这个读者的Java版本可能不会很好地处理这种情况.
我会说,有一个servlet返回一个ZipInputStream是相当不寻常的(如果你要接收压缩的内容,它是更常见的接收一个inflatorInputStream.