5

Java アプリでいくつかのファイルをダウンロードし、ダウンロード モニター ダイアログを実装しました。しかし最近、すべてのファイルを gzip で圧縮したところ、ダウンロード モニターが壊れてしまいました。

ファイルを として開き、GZIPInputStreamkB がダウンロードされるたびにダウンロード ステータスを更新します。ファイルのサイズが 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();
}

助けてくれてありがとう!

4

1 に答える 1

4

仕様によると、GZIPInputStreamのサブクラスですInflaterInputStream。解凍作業に使用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();
于 2012-08-25T18:49:51.573 に答える