首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么每次只能从okhttp.Response InputStream读取2048字节?

为什么每次只能从okhttp.Response InputStream读取2048字节?
EN

Stack Overflow用户
提问于 2014-09-24 17:49:39
回答 1查看 4.7K关注 0票数 5

我正在使用OkHttp GET请求下载一个文件:

代码语言:javascript
运行
复制
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:

代码语言:javascript
运行
复制
BufferedInputStream in = new BufferedInputStream(response.body().byteStream(), 4096);

但是,当我尝试从缓冲区读取时,第一个read返回1179字节。在此之后,我只能一次读取2048字节:

代码语言:javascript
运行
复制
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字节?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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回购上了解更多关于它们的信息。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26023326

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档