Okio’s buffer reads like an
InputStream: when you read 50 bytes from the buffer, you implicitly remove those bytes from the buffer. This is a handy optimization and it means we can move data rather than copying it by default.
But sometimes you need non-destructive reads. So in Okio 1.3 we've changed the
Buffer.clone() method to do segment sharing. Previously, cloning a 2 megabyte buffer would require 2 megabytes of memory to be allocated and copied. With segment sharing, only the bookkeeping data is copied, which is about 3% of the size of the buffer’s data.
To read a buffer without consuming it, just create a (cheap) copy and read that. And our fundamental optimization is preserved: reading from the clone will move data rather than making even more copies.
Okio 1.3 also adds some nice ergonomic features to ByteString:
- URL-safe Base64 encoding
- Handy MD5 and SHA-256 hashes
- Read and write signed decimal values without the string intermediates that you'd need with
Long.valueOf(String). We can use this in DiskLruCache’s journal file, among other places.
- Read and write unsigned hexadecimal values, also without intermediate strings. We’re already using this for chunked encoding in OkHttp.
Okio is an easy-to-use, efficient library for Java I/O that everyone should try. We're very proud of it!
The changelog has full details of what's new & what's been fixed. Get 1.3.0 from Maven Central:
<dependency> <groupId>com.squareup.okio</groupId> <artifactId>okio</artifactId> <version>1.3.0</version> </dependency>