2018-02-11
Buffer.UnsafeCursor provides direct access to Okio internals. This API is like Okio‘s version of Java reflection: it’s a very powerful API that can be used for great things and dangerous things alike. The documentation is extensive and anyone using it should review it carefully before proceeding!BufferedSource to implement java.nio.ReadableByteChannel and BufferedSink to implement java.nio.WritableByteChannel. Now it's a little easier to interop between Okio and NIO.okio for use with the Java Platform Module System.Buffer.getByte() to search backwards when doing so will be more efficient.InflaterSource. Previously this class could return more bytes than requested.AsyncTimeout.sink().write().2017-05-12
Okio now uses @Nullable to annotate all possibly-null values. We've added a compile-time dependency on the JSR 305 annotations. This is a provided dependency and does not need to be included in your build configuration, .jar file, or .apk. We use @ParametersAreNonnullByDefault and all parameters and return types are never null unless explicitly annotated @Nullable.
Warning: this release is source-incompatible for Kotlin users. Nullability was previously ambiguous and lenient but now the compiler will enforce strict null checks.
2017-04-11
writeUtf8CodePoint() to emit ? for partial surrogates. The previous behavior was inconsistent: given a malformed string with a partial surrogate, writeUtf8() emitted ? but writeUtf8CodePoint() threw an IllegalArgumentException. Most applications will never encounter partial surrogates, but for those that do this behavior was unexpected.readUtf8LineStrict() to be limited.Utf8.size() method to get the number of bytes required to encode a string as UTF-8. This may be useful for length-prefixed encodings.2016-10-11
Buffer.writeString() had a major bug where it didn't respect offsets if the specified charset was UTF-8. This was because our short-circuit optimization omitted necessary offset parameters.HashingSource, HashingSink, ByteString, and Buffer. This makes it easy to create a keyed-hash message authentication code (HMAC) wherever your data is. Unlike the other hashes, HMAC uses a ByteString secret key for authentication.ByteString.of(ByteBuffer) makes it easier to mix NIO with Okio.2016-08-28
GzipSource. Previously attempting to decompress such files would fail due to an overflow when validating the total length.Okio.blackhole() returns a sink where all bytes written are discarded. This is Okio's equivalent of /dev/null.ByteString.encodeString() and decode strings in any charset using ByteString.string(). Most applications should prefer ByteString.encodeUtf8() and ByteString.utf8() unless it's necessary to support a legacy charset.GzipSink.deflater() makes it possible to configure the compression level.2016-07-01
Pipe makes it easy to connect a producer thread to a consumer thread. Reads block until data is available to read. Writes block if the pipe's is full. Both sources and sinks support timeouts.BufferedSource.rangeEquals() makes it easy to compare a range in a stream to an expected value. This does the right thing: it blocks to load the data required return a definitive result. But it won't block unnecessarily.Timeout.waitUntilNotified() makes it possible to use nice timeout abstractions on Java's built-in wait/notify primitives.HashingSource does large reads. There was a bug where it wasn’t traversing through the segments of the buffer being hashed. This means that HashingSource was returning incorrect answers for any writes that spanned multiple segment boundaries.2016-05-02
BufferedSource.select(Options) API for reading one of a set of expected values.ByteString.toString() and Buffer.toString() friendlier. These methods return text if the byte string is valid UTF-8.indexOf(), startsWith(), and endsWith().2016-04-10
md5(), sha1(), and sha256() methods on Buffer. Also add a sha1() method on ByteString for symmetry.HashingSource and HashingSink. These classes are Okio’s equivalent to the JDK’s DigestInputStream and DigestOutputStream. They offer convenient md5(), sha1(), and sha256() factory methods to avoid an impossible NoSuchAlgorithmException.ByteString.asByteBuffer().BufferedSource.indexOfElement() and indexOf(ByteString). Previously this method had a bug that caused it to be very slow on large buffers.2015-08-25
BufferedSource.indexOf(ByteString) searches a source for the next occurrence of a byte string.AssertionError thrown on Android 4.2.2 and earlier when asynchronously closing a socket.2015-06-19
SocketTimeoutException. This builds on new extension point in AsyncTimeout to customize the exception when a timeout occurs.ByteString now implements Comparable. The comparison sorts bytes as unsigned: {@code ff} sorts after {@code 00}.2015-05-16
Timeout.throwIfReached() would throw InterruptedIOException on thread interruption, and IOException if the deadline was reached. Now it throws InterruptedIOException in both cases.EOFException when attempting to read digits from an empty source. Previously this would crash with an unchecked exception.BufferedSink can now write substrings directly, potentially saving an allocation for some callers.ForwardingTimeout class.2015-03-16
BufferedSource and BufferedSink. Unlike the alternatives, these methods don’t do any memory allocations!Buffer.clone() and Buffer.copyTo() by sharing underlying segments between buffers.Buffer.snapshot() returns an immutable snapshot of a buffer as a ByteString. This builds on segment sharing so that snapshots are shallow, immutable copies.ByteString.rangeEquals().ByteString.md5() and ByteString.sha256().ByteString.base64Url() returns URL-safe Base64. The existing decoding method has been extended to support URL-safe Base64 input.ByteString.substring() returns a prefix, infix, or suffix.Sink now implements java.io.Flushable.Buffer.write(Source, long) now always writes fully. The previous behavior would return as soon as any data had been written; this was inconsistent with all other write() methods in the API.2014-12-30
Okio.buffer() always buffers for better predictability.readUtf8LineStrict() throws.Source on zero-byte writes.2014-12-11
BufferedSink.emit(), BufferedSource.request() and BufferedSink.indexOfElement().Buffer.indexOf()2014-08-08
read(byte[]), read(byte[], offset, byteCount), and void readFully(byte[]) to BufferedSource.Buffer methods.2014-05-23
2014-05-03
2014-04-24
2014-04-18
2014-04-17
2014-04-15
ByteString.of(byte[] data, int offset, int byteCount)2014-04-08