2

GZIPInputStreamPDFファイルのダウンロードに使用しています。UI ボタン​​にファイルのダウンロードの進行状況を表示したい。しかし、ファイルの実際のサイズを取得していません。取得しているのは圧縮されたサイズであるため、正しいダウンロードの進行状況を表示できません。100実際のファイル サイズがファイルの圧縮サイズよりも大きいため、このダウンロードの進行状況は超過しています。

サーバーからのファイルのヘッダー コンテンツ: サーバーから受け取った次の情報は、使用しているサーバーからcontent-length圧縮されたファイル サイズを提供しています。

1.Connection
2.Content-Encoding
3.Content-length
4.Content-Type
5.Keep-Alive
6.Server
7.Date

これが私のコードです。ファイルの元のサイズを取得する方法はありますか?

long fileLength =  httpResponse.getEntity().getContentLength();//
GZIPInputStream input = new GZIPInputStream(new BufferedInputStream(
        httpResponse.getEntity().getContent()));
FileOutputStream output = new FileOutputStream(destinationFilePath);

byte data[] = new byte[1024];
long total = 0;
float percentage = 0;
int count;
currentDownloadingPercentage=0;
while ((count = input.read(data)) != -1) {
    total += count;
    output.write(data, 0, count);

    // publishing the progress....
    percentage = (float)total/(float)fileLength;
    percentage *= 100;
    if ((int)percentage > (int)currentDownloadingPercentage) {
        currentDownloadingPercentage = percentage;
        Bundle resultData = new Bundle();
        resultData.putBoolean(DOWNLOAD_FAILED, false);
        resultData.putInt(DOWNLOAD_PROGRESS ,(int)percentage);
        receiver.send(processID, resultData);
        resultData = null;  
    }
}
4

2 に答える 2

0

あなたはそれを間違った方法で見ています。読み取った圧縮バイトをカウントし、それらに基づいて進行状況を計算する必要があります。代わりに、解凍されたバイト数をカウントし、それを圧縮ファイルのサイズと比較しています。あなたの質問への回答として、解凍せずに gzip ファイルのサイズを決定する (信頼できる) 方法はありません。

更新:TeeInputStream入ってくる圧縮されていないバイト数をカウントする方法の 1 つを次に示します。GZIPInputStream でラップする前に、生の入力ストリームを でラップします。TeeInputStream を に分岐させCountingOutputStreamます。次に、ダウンロードされた圧縮バイトの現在のカウントを常に取得しますgetByteCount()

于 2013-03-05T03:16:30.147 に答える