我正在使用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);
但是,当我尝试从缓冲区读取时,第一个read返回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;
}
几个相关问题:
InputStream
读入的大小为2048字节,而不是BufferedInputStream
包装器指定的值?OkHttpClient
配置为从缓冲区读取超过2048字节?发布于 2014-09-24 18:25:57
是什么导致第一次读取返回1179字节?某种文件头?
HTTP头是您正在读取的响应的869字节。
为什么从InputStream读入的大小为2048字节,而不是BufferedInputStream包装器指定的值?
您必须深入研究BufferedInputStream
,以了解它为什么不将两个页面连接在一起。
来自InputStream
的OkHttp正在处理2048块块,因为它使用一个池来保存分配。
是否有一种方法可以将OkHttpClient配置为从缓冲区读取超过2048字节?
不是的。
根据您正在做的事情,您通常会有更好的时间使用来自response.body().source()
的response.body().source()
而不是使用BufferedInputStream
。您可以在Okio回购上了解更多关于它们的信息。
https://stackoverflow.com/questions/26023326
复制相似问题