5

以下を使用して、URL のコンテンツのサイズを取得しようとしています。

URLConnection conn = null;
URL url = null;
url = new URL("https://dl.dropboxusercontent.com/u/90210205/Default.html");
conn = url.openConnection();
conn.connect();
InputStream in = new BufferedInputStream(url.openStream());
int fileSize = conn.getContentLength();
System.out.println("File size " + fileSize);
while (in.read() != -1) {
    i++;
}
in.close();
System.out.println("Read " + i + " bytes of a possible " + fileSize);

私はこれを の 内で使用していますが、doInBackground()何らかのAsyncTask理由conn.getContentLength();で を返す1273必要があるときに を返してい10136ます。

上記のコードを通常の Java アプリケーションの Main 内で使用したところconn.getContentLength();、正しい 10136 値が返されました。

で機能しないのはなぜAsyncTaskですか?

4

1 に答える 1

3

の説明は、ヘッダー フィールド.getContentLength()の値を返すことです。Content-Length通常の状況では、これは読み取り可能なデータ量と一致するはずです。でも...

(1) データの送信にチャンク エンコーディングが使用されている場合、ヘッダーが存在しない場合があります。この場合、ここではそうではないように見えるように.getContentLength()戻ります-1

(2) デフォルトでは、HttpURLConnectionサーバーが gzip 圧縮を使用し、 の呼び出し元のデータを自動的に解凍する要求の実装getInputStream()。この場合、Content-Encoding および Content-Length 応答ヘッダーはクリアされます。

-1最後の文は、.getContentLength()` から取得していないため、ここでもそうではないことを示しているようですが、相対的なサイズ (1273 / 10136) は疑わしくなります...

これの 1 つのテストは、要求ヘッダーで受け入れ可能なエンコーディングを次のように設定して、Gzip エンコーディングを無効にすることです。

urlConnection.setRequestProperty("Accept-Encoding", "identity");

もう 1 つの方法は、ネットワーク トラフィックを「スヌープ」して、http ヘッダーと手がかりのデータ量を観察することです。

ところで、url.openStream()便利ですurl.openConnection().getInputStream()

于 2016-01-31T18:23:20.903 に答える