我正在使用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();
我从响应体中读取数据,并使用缓冲区大小为4096的BufferedInputStream
进行装饰:
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;
}
以下是几个相关问题:
- 为什么第一次读取返回1179字节?是否是某种文件头导致的?
InputStream
中的读取为什么会被分页到2048字节大小,而不是BufferedInputStream
包装器指定的值?- 是否有一种方法可以配置
OkHttpClient
从缓冲区中读取超过2048字节的数据?