Я загружаю файл, используя реализацию 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*?Что я делаю не так?