根据https://futurestud.io/tutorials/retrofit-2-how-to-download-files-from-server上的精美教程,我正在使用REST API的Retrofit2实现下载文件。
我的API接口将@GET
声明为@Streaming
,实际上,当我从InputStream
给我的byteStream()
中读取内容时,我可以读取整个29 MB的文件。
我想做的是全部读取4 MB的块,因此我使用的是Okio方便的BufferedSource
。问题是,尽管总文件大小约为29 MB,我对request(4*1024*1024)
的调用仅一次返回true
。
我的Java:
@Streaming @GET Call<ResponseBody> get(@Url String url);
// ...
Response<ResponseBody> response = api.get("https://my.file.url");
final int bufSize = 4*1024*1024;
byte[] buffer;
long total;
InputStream is = response.body().byteStream();
BufferedSource ss = Okio.buffer(Okio.source(is));
// Is this the same as ss=response.body().source() ??
while (ss.request(bufSize)) {
buffer = ss.readByteArray();
total += doSomethingUsefulWith(buffer);
System.out.println("Running total: " + total);
}
// Capture the < 4MB residue
buffer = ss.readByteArray();
if (buffer.length > 0) {
total += doSomethingUsefulWith(buffer);
System.out.println("Total: " + total);
}
System.out.println("That's all, folks!");
控制台输出:
Running total: 4194304
That's all, folks!
同样,原始InputStream
确实给了我全部29 MB的空间,我之前已经做过。我会误解request()
吗?我在做什么错了?
答案 0 :(得分:1)
对ss.readByteArray()
的调用会将整个正文读取为字节数组。您是想做ss.readByteArray(bufSize)
吗?