Запрос Okio BufferedSource () срабатывает только один раз - PullRequest
0 голосов
/ 28 марта 2019

Я загружаю файл, используя реализацию Retrofit2 REST API, согласно хорошему учебнику по https://futurestud.io/tutorials/retrofit-2-how-to-download-files-from-server.

Мой интерфейс API объявляет @GET как @Streaming, и действительно, когда я читаюиз InputStream, предоставленного мне byteStream(), я могу прочитать весь файл размером 29 МБ.

Что я хотел бы сделать, так это прочитать все по 4 МБ, поэтому я использую удобную программу OkioBufferedSource.Проблема в том, что мой вызов request(4request()1024) возвращает true только один раз , хотя общий размер файла составляет порядка 29 МБ.

Моя 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 МБ, я делал это раньше.Я неправильно понимаю *1024*?Что я делаю не так?

1 Ответ

1 голос
/ 10 апреля 2019

Вызов ss.readByteArray() прочитает все тело в байтовый массив.Вы хотели сделать ss.readByteArray(bufSize)?

...