For what it’s worth, I would recommend response.body().source()
from okio (since OkHttp is already supporting it natively) in order to enjoy an easier way to manipulate a large quantity of data that can come when downloading a file.
@Override
public void onResponse(Call call, Response response) throws IOException {
File downloadedFile = new File(context.getCacheDir(), filename);
BufferedSink sink = Okio.buffer(Okio.sink(downloadedFile));
sink.writeAll(response.body().source());
sink.close();
}
A couple of advantages taken from the documentation in comparison with InputStream:
This interface is functionally equivalent to InputStream.
InputStream requires multiple layers when consumed data is heterogeneous: a DataInputStream for primitive values, a BufferedInputStream for buffering, and InputStreamReader for strings. This class uses BufferedSource for all of the above.
Source avoids the impossible-to-implement available() method. Instead callers specify how many bytes they require.Source omits the unsafe-to-compose mark and reset state that’s tracked by InputStream; callers instead just buffer what they need.
When implementing a source, you need not worry about the single-byte read method that is awkward to implement efficiently and that returns one of 257 possible values.
And source has a stronger skip method: BufferedSource.skip(long) won’t return prematurely.