ZipInputStream 不报告*实际*(即压缩)读取的字节
喜欢这个网站! 我的问题如下:
我正在读取来自 HTTP“PUT”请求通过网络发送的 zip 文件。 请求标头告诉我内容长度是(比如说)1Mb。 以下代码创建 ZipInputStream,并将 zip 内容保存到当前目录中的文件中:
ZipInputStream zis = new ZipInputStream(inputStream);
ZipEntry ze;
long totalBytesRead = 0;
while ((ze = zis.getNextEntry()) != null) {
BufferedOutputStream outStream = new BufferedOutputStream(new FileOutputStream(ze.getName()));
byte[] buffer = new byte[4096];
int i;
while ((i = zis.read(buffer)) != -1) {
totalBytesRead+=i;
outStream.write(buffer,0,i);
}
outStream.close();
}
inputStream.close();
完成所有操作后,totalBytesRead
等于大约 1.5Mb(取决于文件的压缩程度,可能是无论如何!)。 我想知道是否有办法找出从原始 inputStream
中读取了多少实际字节? 对于每个压缩条目,ze.getSize()
和 ze.getCompressedSize()
都返回 -1(即它不知道)。 我需要此信息作为进度条,以显示已从网络读取传输的 zip 文件的字节数。
建议? 我是否应该子类化 ZipInputStream 并尝试找出它从包装的 InputStream 中读取了多少字节?
提前致谢!
Love this website! My issue is as follows:
I'm reading a zip file that's coming over a network from an HTTP "PUT" request. The request header tells me that the Content-Length is (say) 1Mb. The following code creates the ZipInputStream, and saves the zip contents to files in the current directory:
ZipInputStream zis = new ZipInputStream(inputStream);
ZipEntry ze;
long totalBytesRead = 0;
while ((ze = zis.getNextEntry()) != null) {
BufferedOutputStream outStream = new BufferedOutputStream(new FileOutputStream(ze.getName()));
byte[] buffer = new byte[4096];
int i;
while ((i = zis.read(buffer)) != -1) {
totalBytesRead+=i;
outStream.write(buffer,0,i);
}
outStream.close();
}
inputStream.close();
When all is said and done, totalBytesRead
is equal to about 1.5Mb (depending on compression of the files, could be anything though!). What I'd like to know is if there is a way to find out how many actual bytes have been read from the original inputStream
? Both ze.getSize()
and ze.getCompressedSize()
return -1 for every zipped entry (i.e. it doesn't know). I need this info for a progress bar to show how many bytes of the transmitted zip file have been read off the network.
Suggestions? Should I perhaps subclass ZipInputStream and try to find out how many bytes it's reading from it's wrapped InputStream?
Thanks in advance!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
这介于两者之间,就像
This goes in between like
谢谢你们俩! 我刚刚完成的制作几乎完全符合克林特的建议!
现在我想知道我应该给谁这个小“复选标记”......?
再次感谢!
Thank you both! I just finished making pretty much exactly what Clint suggested!
Now I wonder who I should give the little "check-mark" to...?
Thanks again!
当然,这看起来很合理。
基本上有两种选择:读取所有字节,将它们存储(在内存或文件中),对它们进行计数,然后解压缩它们; 前者似乎效率低下,而后者需要一个 InputStream 的子类,该子类能够计算它读取的字节数。 我想不出标准库中有一个,但实现可能已经存在了——话又说回来,编写自己的实现也很容易。
Sure, that seems reasonable.
There are basically two options: read all the bytes, store them (in memory or a file), count them, then decompress them; or count them as they come in. The former seems inefficient, and the latter will require a subclass of
InputStream
which has the ability to count the bytes it reads. I can't think of one in the standard library, but implementations probably exist out there - then again it'd be pretty easy to write your own.这就是我所做的......不需要覆盖任何东西。
This is what I do... no need to override anything.