在Java中监控GZip下载进度

5
我在我的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, 0, count);
    downloaded += count;
    this.stateChanged();
}

...

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

感谢任何帮助!

我正在读取由GZipInputStream下载的字节,这是未压缩的流。因此,这不是实际下载的文件大小。 - dbrettschneider
1个回答

4
根据规范,GZIPInputStreamInflaterInputStream 的子类。 InflaterInputStream 有一个protected Inflater inf 字段,用于解压缩工作的是 InflaterInflater.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();

谢谢!我只需要实现一个自定义的GZIPInputStream,使得Inflater intgetBytesRead()可用。 - dbrettschneider
谢谢,这正是我在寻找的! - Josue Espinosa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接