微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

监控GZip下载Java的进展

我在我的Java应用程序中下载了一些文件并实现了下载监视器对话框.但最近我使用gzip压缩了所有文件,现在下载监视器有点破碎了.

我将文件作为GZIPInputStream打开,并在每次下载KB后更新下载状态.如果文件大小为1MB,则进度可达到4MB是未压缩的大小.我想监视压缩的下载进度.这可能吗?

编辑:澄清:我正在读取GZipInputStream中的字节,这些字节是未压缩的字节.所以这并没有给我正确的文件大小.

这是我的代码

URL url = new URL(urlString);
HttpURLConnection con = (HttpURLConnection) url.openConnection();
con.connect();
...
File file = new File("bibles/" + name + ".xml");
if(!file.exists())
    file.createNewFile();
out = new FileOutputStream(file);
in = new BufferedInputStream(new GZIPInputStream(con.getInputStream()));

byte[] buffer = new byte[1024];
int count;
while((count = in.read(buffer)) != -1) {
    out.write(buffer,count);
    downloaded += count;
    this.stateChanged();
}

...

private void stateChanged() {
    this.setChanged();
    this.notifyObservers();
}

谢谢你的帮助!

最佳答案
根据规范,GZIPInputStreamInflaterInputStream的子类.InflaterInputStream具有protected Inflater inf字段,其是用于解压缩工作的Inflater. Inflater.getBytesRead应该对您的目的特别有用.

不幸的是,GZIPInputStream不会暴露inf,所以可能你必须创建自己的子类并暴露Inflater,例如

public final class ExposedGZIPInputStream extends GZIPInputStream {

  public ExposedGZIPInputStream(final InputStream stream) {
    super(stream);
  }

  public ExposedGZIPInputStream(final InputStream stream,final int n) {
    super(stream,n);
  }

  public Inflater inflater() {
    return super.inf;
  }
}
...
final ExposedGZIPInputStream gzip = new ExposedGZIPInputStream(...);
...
final Inflater inflater = gzip.inflater();
final long read = inflater.getBytesRead();

原文地址:https://www.jb51.cc/java/438162.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐