Okio的BufferedSource request()仅触发一次

时间:2019-03-28 01:56:10

标签: retrofit2 okio

根据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()吗?我在做什么错了?

1 个答案:

答案 0 :(得分:1)

ss.readByteArray()的调用会将整个正文读取为字节数组。您是想做ss.readByteArray(bufSize)吗?