5

OkHttp GET リクエストを使用してファイルをダウンロードしています。

import com.squareup.okhttp.OkHttpClient;
import com.squareup.okhttp.Request;
import com.squareup.okhttp.Response;
...
OkHttpClient okClient = new OkHttpClient();
Request request = Request.Builder().url(url).get();
Response response = okClient.newCall(request).execute();

応答本文から読み取りBufferedInputStream、バッファー サイズが 4096 の で装飾します。

BufferedInputStream in = new BufferedInputStream(response.body().byteStream(), 4096);

ただし、バッファから読み取ろうとすると、最初の読み取りで 1179 バイトが返されます。その後、一度に 2048 バイトしか読み取ることができません。

byte[] buffer = new byte[4096];
while (true) {
    int bytesRead = in.read(buffer); //bytesRead is always 2048, except the first read
    if (bytesRead == -1) break;
}

いくつかの関連する質問:

  1. 最初の読み取りで 1179 バイトが返される原因は何ですか? ある種のファイルヘッダー?
  2. ラッパーInputStreamによって指定された値ではなく、2048 バイトのサイズにページングされているからの読み取りが行われるのはなぜですか?BufferedInputStream
  3. OkHttpClientバッファから 2048 バイト以上を読み取るように を設定する方法はありますか?
4

1 に答える 1

5

最初の読み取りで 1179 バイトが返される原因は何ですか? ある種のファイルヘッダー?

読み取っている応答の HTTP ヘッダーは 869 バイトです。

BufferedInputStream ラッパーで指定された値ではなく、InputStream からの読み取りが 2048 バイトのサイズにページングされるのはなぜですか?

BufferedInputStream2 つのページが結合されていない理由を調べるには、掘り下げて調べる必要があります。

からのInputStreamOkHttp は、割り当てを保存するためにそれらのプールを使用するため、2048 個のチャンクを処理しています。

バッファから 2048 バイト以上を読み取るように OkHttpClient を構成する方法はありますか?

いいえ。


何をしているかにもよりますが、通常は from を使用するよりもBufferedSourcefromを使用する方がはるかに優れています。詳細については、Okio repoを参照してください。response.body().source()BufferedInputStream

于 2014-09-24T18:25:57.397 に答える