public final class Buffer extends java.lang.Object implements BufferedSource, BufferedSink, java.lang.Cloneable, java.nio.channels.ByteChannel
Moving data from one buffer to another is fast. Instead of copying bytes from one place in memory to another, this class just changes ownership of the underlying byte arrays.
This buffer grows with your data. Just like ArrayList, each buffer starts small. It consumes only the memory it needs to.
This buffer pools its byte arrays. When you allocate a byte array in Java, the runtime must zero-fill the requested array before returning it to you. Even if you're going to write over that space anyway. This class avoids zero-fill and GC churn by pooling byte arrays.
Modifier and Type | Class and Description |
---|---|
static class |
Buffer.UnsafeCursor
A handle to the underlying data in a buffer.
|
Constructor and Description |
---|
Buffer() |
Modifier and Type | Method and Description |
---|---|
Buffer |
buffer()
Returns this source's internal buffer.
|
void |
clear()
Discards all bytes in this buffer.
|
Buffer |
clone()
Returns a deep copy of this buffer.
|
void |
close()
Closes this source and releases the resources held by this source.
|
long |
completeSegmentByteCount()
Returns the number of bytes in segments that are not writable.
|
Buffer |
copyTo(Buffer out,
long offset,
long byteCount)
Copy
byteCount bytes from this, starting at offset , to out . |
Buffer |
copyTo(java.io.OutputStream out)
Copy the contents of this to
out . |
Buffer |
copyTo(java.io.OutputStream out,
long offset,
long byteCount)
Copy
byteCount bytes from this, starting at offset , to
out . |
BufferedSink |
emit()
Writes all buffered data to the underlying sink, if one exists.
|
Buffer |
emitCompleteSegments()
Writes complete segments to the underlying sink, if one exists.
|
boolean |
equals(java.lang.Object o) |
boolean |
exhausted()
Returns true if there are no more bytes in this source.
|
void |
flush()
Writes all buffered data to the underlying sink, if one exists.
|
Buffer |
getBuffer()
This source's internal buffer.
|
byte |
getByte(long pos)
Returns the byte at
pos . |
int |
hashCode() |
ByteString |
hmacSha1(ByteString key)
Returns the 160-bit SHA-1 HMAC of this buffer.
|
ByteString |
hmacSha256(ByteString key)
Returns the 256-bit SHA-256 HMAC of this buffer.
|
ByteString |
hmacSha512(ByteString key)
Returns the 512-bit SHA-512 HMAC of this buffer.
|
long |
indexOf(byte b)
Equivalent to
indexOf(b, 0) . |
long |
indexOf(byte b,
long fromIndex)
Returns the index of
b in this at or beyond fromIndex , or
-1 if this buffer does not contain b in that range. |
long |
indexOf(byte b,
long fromIndex,
long toIndex)
Returns the index of
b if it is found in the range of fromIndex inclusive
to toIndex exclusive. |
long |
indexOf(ByteString bytes)
Equivalent to
indexOf(bytes, 0) . |
long |
indexOf(ByteString bytes,
long fromIndex)
Returns the index of the first match for
bytes in the buffer at or after fromIndex . |
long |
indexOfElement(ByteString targetBytes)
Equivalent to
indexOfElement(targetBytes, 0) . |
long |
indexOfElement(ByteString targetBytes,
long fromIndex)
Returns the first index in this buffer that is at or after
fromIndex and that contains
any of the bytes in targetBytes . |
java.io.InputStream |
inputStream()
Returns an input stream that reads from this source.
|
boolean |
isOpen() |
ByteString |
md5()
Returns the 128-bit MD5 hash of this buffer.
|
java.io.OutputStream |
outputStream()
Returns an output stream that writes to this sink.
|
BufferedSource |
peek()
Returns a new
BufferedSource that can read data from this BufferedSource
without consuming it. |
boolean |
rangeEquals(long offset,
ByteString bytes)
Returns true if the bytes at
offset in this source equal bytes . |
boolean |
rangeEquals(long offset,
ByteString bytes,
int bytesOffset,
int byteCount)
Returns true if
byteCount bytes at offset in this source equal bytes
at bytesOffset . |
long |
read(Buffer sink,
long byteCount)
Removes at least 1, and up to
byteCount bytes from this and appends
them to sink . |
int |
read(byte[] sink)
Removes up to
sink.length bytes from this and copies them into sink . |
int |
read(byte[] sink,
int offset,
int byteCount)
Removes up to
byteCount bytes from this and copies them into sink at offset . |
int |
read(java.nio.ByteBuffer sink) |
long |
readAll(Sink sink)
Removes all bytes from this and appends them to
sink . |
Buffer.UnsafeCursor |
readAndWriteUnsafe() |
Buffer.UnsafeCursor |
readAndWriteUnsafe(Buffer.UnsafeCursor unsafeCursor) |
byte |
readByte()
Removes a byte from this source and returns it.
|
byte[] |
readByteArray()
Removes all bytes from this and returns them as a byte array.
|
byte[] |
readByteArray(long byteCount)
Removes
byteCount bytes from this and returns them as a byte array. |
ByteString |
readByteString()
Removes all bytes bytes from this and returns them as a byte string.
|
ByteString |
readByteString(long byteCount)
Removes
byteCount bytes from this and returns them as a byte string. |
long |
readDecimalLong()
Reads a long from this source in signed decimal form (i.e., as a string in base 10 with
optional leading '-').
|
Buffer |
readFrom(java.io.InputStream in)
Read and exhaust bytes from
in to this. |
Buffer |
readFrom(java.io.InputStream in,
long byteCount)
Read
byteCount bytes from in to this. |
void |
readFully(Buffer sink,
long byteCount)
Removes exactly
byteCount bytes from this and appends them to sink . |
void |
readFully(byte[] sink)
Removes exactly
sink.length bytes from this and copies them into sink . |
long |
readHexadecimalUnsignedLong()
Reads a long form this source in hexadecimal form (i.e., as a string in base 16).
|
int |
readInt()
Removes four bytes from this source and returns a big-endian int.
|
int |
readIntLe()
Removes four bytes from this source and returns a little-endian int.
|
long |
readLong()
Removes eight bytes from this source and returns a big-endian long.
|
long |
readLongLe()
Removes eight bytes from this source and returns a little-endian long.
|
short |
readShort()
Removes two bytes from this source and returns a big-endian short.
|
short |
readShortLe()
Removes two bytes from this source and returns a little-endian short.
|
java.lang.String |
readString(java.nio.charset.Charset charset)
Removes all bytes from this, decodes them as
charset , and returns the string. |
java.lang.String |
readString(long byteCount,
java.nio.charset.Charset charset)
Removes
byteCount bytes from this, decodes them as charset , and returns the
string. |
Buffer.UnsafeCursor |
readUnsafe() |
Buffer.UnsafeCursor |
readUnsafe(Buffer.UnsafeCursor unsafeCursor) |
java.lang.String |
readUtf8()
Removes all bytes from this, decodes them as UTF-8, and returns the string.
|
java.lang.String |
readUtf8(long byteCount)
Removes
byteCount bytes from this, decodes them as UTF-8, and returns the string. |
int |
readUtf8CodePoint()
Removes and returns a single UTF-8 code point, reading between 1 and 4 bytes as necessary.
|
java.lang.String |
readUtf8Line()
Removes and returns characters up to but not including the next line break.
|
java.lang.String |
readUtf8LineStrict()
Removes and returns characters up to but not including the next line break.
|
java.lang.String |
readUtf8LineStrict(long limit)
Like
BufferedSource.readUtf8LineStrict() , except this allows the caller to specify the longest
allowed match. |
boolean |
request(long byteCount)
Returns true when the buffer contains at least
byteCount bytes, expanding it as
necessary. |
void |
require(long byteCount)
Returns when the buffer contains at least
byteCount bytes. |
int |
select(Options options)
Finds the first string in
options that is a prefix of this buffer, consumes it from
this buffer, and returns its index. |
ByteString |
sha1()
Returns the 160-bit SHA-1 hash of this buffer.
|
ByteString |
sha256()
Returns the 256-bit SHA-256 hash of this buffer.
|
ByteString |
sha512()
Returns the 512-bit SHA-512 hash of this buffer.
|
long |
size()
Returns the number of bytes currently in this buffer.
|
void |
skip(long byteCount)
Discards
byteCount bytes from the head of this buffer. |
ByteString |
snapshot()
Returns an immutable copy of this buffer as a byte string.
|
ByteString |
snapshot(int byteCount)
Returns an immutable copy of the first
byteCount bytes of this buffer as a byte string. |
Timeout |
timeout()
Returns the timeout for this source.
|
java.lang.String |
toString()
Returns a human-readable string that describes the contents of this buffer.
|
void |
write(Buffer source,
long byteCount)
Removes
byteCount bytes from source and appends them to this. |
Buffer |
write(byte[] source)
Like
OutputStream.write(byte[]) , this writes a complete byte array to
this sink. |
Buffer |
write(byte[] source,
int offset,
int byteCount)
Like
OutputStream.write(byte[], int, int) , this writes byteCount
bytes of source , starting at offset . |
int |
write(java.nio.ByteBuffer source) |
Buffer |
write(ByteString byteString) |
BufferedSink |
write(Source source,
long byteCount)
Removes
byteCount bytes from source and appends them to this sink. |
long |
writeAll(Source source)
Removes all bytes from
source and appends them to this sink. |
Buffer |
writeByte(int b)
Writes a byte to this sink.
|
Buffer |
writeDecimalLong(long v)
Writes a long to this sink in signed decimal form (i.e., as a string in base 10).
|
Buffer |
writeHexadecimalUnsignedLong(long v)
Writes a long to this sink in hexadecimal form (i.e., as a string in base 16).
|
Buffer |
writeInt(int i)
Writes a big-endian int to this sink using four bytes.
|
Buffer |
writeIntLe(int i)
Writes a little-endian int to this sink using four bytes.
|
Buffer |
writeLong(long v)
Writes a big-endian long to this sink using eight bytes.
|
Buffer |
writeLongLe(long v)
Writes a little-endian long to this sink using eight bytes.
|
Buffer |
writeShort(int s)
Writes a big-endian short to this sink using two bytes.
|
Buffer |
writeShortLe(int s)
Writes a little-endian short to this sink using two bytes.
|
Buffer |
writeString(java.lang.String string,
java.nio.charset.Charset charset)
Encodes
string in charset and writes it to this sink. |
Buffer |
writeString(java.lang.String string,
int beginIndex,
int endIndex,
java.nio.charset.Charset charset)
Encodes the characters at
beginIndex up to endIndex from string in
charset and writes it to this sink. |
Buffer |
writeTo(java.io.OutputStream out)
Write the contents of this to
out . |
Buffer |
writeTo(java.io.OutputStream out,
long byteCount)
Write
byteCount bytes from this to out . |
Buffer |
writeUtf8(java.lang.String string)
Encodes
string in UTF-8 and writes it to this sink. |
Buffer |
writeUtf8(java.lang.String string,
int beginIndex,
int endIndex)
Encodes the characters at
beginIndex up to endIndex from string in
UTF-8 and writes it to this sink. |
Buffer |
writeUtf8CodePoint(int codePoint)
Encodes
codePoint in UTF-8 and writes it to this sink. |
public final long size()
public Buffer buffer()
BufferedSource
buffer
in interface BufferedSink
buffer
in interface BufferedSource
public Buffer getBuffer()
BufferedSource
getBuffer
in interface BufferedSource
public java.io.OutputStream outputStream()
BufferedSink
outputStream
in interface BufferedSink
public Buffer emitCompleteSegments()
BufferedSink
BufferedSink.flush()
, but
weaker. Use this to limit the memory held in the buffer to a single segment. Typically
application code will not need to call this: it is only necessary when application code writes
directly to this sink's buffer.
BufferedSink b0 = new Buffer();
BufferedSink b1 = Okio.buffer(b0);
BufferedSink b2 = Okio.buffer(b1);
b2.buffer().write(new byte[20_000]);
assertEquals(20_000, b2.buffer().size());
assertEquals( 0, b1.buffer().size());
assertEquals( 0, b0.buffer().size());
b2.emitCompleteSegments();
assertEquals( 3_616, b2.buffer().size());
assertEquals( 0, b1.buffer().size());
assertEquals(16_384, b0.buffer().size()); // This example assumes 8192 byte segments.
emitCompleteSegments
in interface BufferedSink
public BufferedSink emit()
BufferedSink
BufferedSink.flush()
, but
weaker. Call this before this buffered sink goes out of scope so that its data can reach its
destination.
BufferedSink b0 = new Buffer();
BufferedSink b1 = Okio.buffer(b0);
BufferedSink b2 = Okio.buffer(b1);
b2.writeUtf8("hello");
assertEquals(5, b2.buffer().size());
assertEquals(0, b1.buffer().size());
assertEquals(0, b0.buffer().size());
b2.emit();
assertEquals(0, b2.buffer().size());
assertEquals(5, b1.buffer().size());
assertEquals(0, b0.buffer().size());
b1.emit();
assertEquals(0, b2.buffer().size());
assertEquals(0, b1.buffer().size());
assertEquals(5, b0.buffer().size());
emit
in interface BufferedSink
public boolean exhausted()
BufferedSource
exhausted
in interface BufferedSource
public void require(long byteCount) throws java.io.EOFException
BufferedSource
byteCount
bytes. Throws an
EOFException
if the source is exhausted before the required bytes can be read.require
in interface BufferedSource
java.io.EOFException
public boolean request(long byteCount)
BufferedSource
byteCount
bytes, expanding it as
necessary. Returns false if the source is exhausted before the requested bytes can be read.request
in interface BufferedSource
public BufferedSource peek()
BufferedSource
BufferedSource
that can read data from this BufferedSource
without consuming it. The returned source becomes invalid once this source is next read or
closed.
For example, we can use peek()
to lookahead and read the same data multiple times.
Buffer buffer = new Buffer();
buffer.writeUtf8("abcdefghi");
buffer.readUtf8(3) // returns "abc", buffer contains "defghi"
BufferedSource peek = buffer.peek();
peek.readUtf8(3); // returns "def", buffer contains "defghi"
peek.readUtf8(3); // returns "ghi", buffer contains "defghi"
buffer.readUtf8(3); // returns "def", buffer contains "ghi"
peek
in interface BufferedSource
public java.io.InputStream inputStream()
BufferedSource
inputStream
in interface BufferedSource
public final Buffer copyTo(java.io.OutputStream out) throws java.io.IOException
out
.java.io.IOException
public final Buffer copyTo(java.io.OutputStream out, long offset, long byteCount) throws java.io.IOException
byteCount
bytes from this, starting at offset
, to
out
.java.io.IOException
public final Buffer copyTo(Buffer out, long offset, long byteCount)
byteCount
bytes from this, starting at offset
, to out
.public final Buffer writeTo(java.io.OutputStream out) throws java.io.IOException
out
.java.io.IOException
public final Buffer writeTo(java.io.OutputStream out, long byteCount) throws java.io.IOException
byteCount
bytes from this to out
.java.io.IOException
public final Buffer readFrom(java.io.InputStream in) throws java.io.IOException
in
to this.java.io.IOException
public final Buffer readFrom(java.io.InputStream in, long byteCount) throws java.io.IOException
byteCount
bytes from in
to this.java.io.IOException
public final long completeSegmentByteCount()
public byte readByte()
BufferedSource
readByte
in interface BufferedSource
public final byte getByte(long pos)
pos
.public short readShort()
BufferedSource
Buffer buffer = new Buffer()
.writeByte(0x7f)
.writeByte(0xff)
.writeByte(0x00)
.writeByte(0x0f);
assertEquals(4, buffer.size());
assertEquals(32767, buffer.readShort());
assertEquals(2, buffer.size());
assertEquals(15, buffer.readShort());
assertEquals(0, buffer.size());
readShort
in interface BufferedSource
public int readInt()
BufferedSource
Buffer buffer = new Buffer()
.writeByte(0x7f)
.writeByte(0xff)
.writeByte(0xff)
.writeByte(0xff)
.writeByte(0x00)
.writeByte(0x00)
.writeByte(0x00)
.writeByte(0x0f);
assertEquals(8, buffer.size());
assertEquals(2147483647, buffer.readInt());
assertEquals(4, buffer.size());
assertEquals(15, buffer.readInt());
assertEquals(0, buffer.size());
readInt
in interface BufferedSource
public long readLong()
BufferedSource
Buffer buffer = new Buffer()
.writeByte(0x7f)
.writeByte(0xff)
.writeByte(0xff)
.writeByte(0xff)
.writeByte(0xff)
.writeByte(0xff)
.writeByte(0xff)
.writeByte(0xff)
.writeByte(0x00)
.writeByte(0x00)
.writeByte(0x00)
.writeByte(0x00)
.writeByte(0x00)
.writeByte(0x00)
.writeByte(0x00)
.writeByte(0x0f);
assertEquals(16, buffer.size());
assertEquals(9223372036854775807L, buffer.readLong());
assertEquals(8, buffer.size());
assertEquals(15, buffer.readLong());
assertEquals(0, buffer.size());
readLong
in interface BufferedSource
public short readShortLe()
BufferedSource
Buffer buffer = new Buffer()
.writeByte(0xff)
.writeByte(0x7f)
.writeByte(0x0f)
.writeByte(0x00);
assertEquals(4, buffer.size());
assertEquals(32767, buffer.readShortLe());
assertEquals(2, buffer.size());
assertEquals(15, buffer.readShortLe());
assertEquals(0, buffer.size());
readShortLe
in interface BufferedSource
public int readIntLe()
BufferedSource
Buffer buffer = new Buffer()
.writeByte(0xff)
.writeByte(0xff)
.writeByte(0xff)
.writeByte(0x7f)
.writeByte(0x0f)
.writeByte(0x00)
.writeByte(0x00)
.writeByte(0x00);
assertEquals(8, buffer.size());
assertEquals(2147483647, buffer.readIntLe());
assertEquals(4, buffer.size());
assertEquals(15, buffer.readIntLe());
assertEquals(0, buffer.size());
readIntLe
in interface BufferedSource
public long readLongLe()
BufferedSource
Buffer buffer = new Buffer()
.writeByte(0xff)
.writeByte(0xff)
.writeByte(0xff)
.writeByte(0xff)
.writeByte(0xff)
.writeByte(0xff)
.writeByte(0xff)
.writeByte(0x7f)
.writeByte(0x0f)
.writeByte(0x00)
.writeByte(0x00)
.writeByte(0x00)
.writeByte(0x00)
.writeByte(0x00)
.writeByte(0x00)
.writeByte(0x00);
assertEquals(16, buffer.size());
assertEquals(9223372036854775807L, buffer.readLongLe());
assertEquals(8, buffer.size());
assertEquals(15, buffer.readLongLe());
assertEquals(0, buffer.size());
readLongLe
in interface BufferedSource
public long readDecimalLong()
BufferedSource
Buffer buffer = new Buffer()
.writeUtf8("8675309 -123 00001");
assertEquals(8675309L, buffer.readDecimalLong());
assertEquals(' ', buffer.readByte());
assertEquals(-123L, buffer.readDecimalLong());
assertEquals(' ', buffer.readByte());
assertEquals(1L, buffer.readDecimalLong());
readDecimalLong
in interface BufferedSource
public long readHexadecimalUnsignedLong()
BufferedSource
Buffer buffer = new Buffer()
.writeUtf8("ffff CAFEBABE 10");
assertEquals(65535L, buffer.readHexadecimalUnsignedLong());
assertEquals(' ', buffer.readByte());
assertEquals(0xcafebabeL, buffer.readHexadecimalUnsignedLong());
assertEquals(' ', buffer.readByte());
assertEquals(0x10L, buffer.readHexadecimalUnsignedLong());
readHexadecimalUnsignedLong
in interface BufferedSource
public ByteString readByteString()
BufferedSource
readByteString
in interface BufferedSource
public ByteString readByteString(long byteCount) throws java.io.EOFException
BufferedSource
byteCount
bytes from this and returns them as a byte string.readByteString
in interface BufferedSource
java.io.EOFException
public int select(Options options)
BufferedSource
options
that is a prefix of this buffer, consumes it from
this buffer, and returns its index. If no byte string in options
is a prefix of this
buffer this returns -1 and no bytes are consumed.
This can be used as an alternative to BufferedSource.readByteString()
or even BufferedSource.readUtf8()
if
the set of expected values is known in advance.
Options FIELDS = Options.of(
ByteString.encodeUtf8("depth="),
ByteString.encodeUtf8("height="),
ByteString.encodeUtf8("width="));
Buffer buffer = new Buffer()
.writeUtf8("width=640\n")
.writeUtf8("height=480\n");
assertEquals(2, buffer.select(FIELDS));
assertEquals(640, buffer.readDecimalLong());
assertEquals('\n', buffer.readByte());
assertEquals(1, buffer.select(FIELDS));
assertEquals(480, buffer.readDecimalLong());
assertEquals('\n', buffer.readByte());
select
in interface BufferedSource
public void readFully(Buffer sink, long byteCount) throws java.io.EOFException
BufferedSource
byteCount
bytes from this and appends them to sink
. Throws an
EOFException
if the requested number of bytes cannot be read.readFully
in interface BufferedSource
java.io.EOFException
public long readAll(Sink sink) throws java.io.IOException
BufferedSource
sink
. Returns the total number of bytes
written to sink
which will be 0 if this is exhausted.readAll
in interface BufferedSource
java.io.IOException
public java.lang.String readUtf8()
BufferedSource
Buffer buffer = new Buffer()
.writeUtf8("Uh uh uh!")
.writeByte(' ')
.writeUtf8("You didn't say the magic word!");
assertEquals("Uh uh uh! You didn't say the magic word!", buffer.readUtf8());
assertEquals(0, buffer.size());
assertEquals("", buffer.readUtf8());
assertEquals(0, buffer.size());
readUtf8
in interface BufferedSource
public java.lang.String readUtf8(long byteCount) throws java.io.EOFException
BufferedSource
byteCount
bytes from this, decodes them as UTF-8, and returns the string.
Buffer buffer = new Buffer()
.writeUtf8("Uh uh uh!")
.writeByte(' ')
.writeUtf8("You didn't say the magic word!");
assertEquals(40, buffer.size());
assertEquals("Uh uh uh! You ", buffer.readUtf8(14));
assertEquals(26, buffer.size());
assertEquals("didn't say the", buffer.readUtf8(14));
assertEquals(12, buffer.size());
assertEquals(" magic word!", buffer.readUtf8(12));
assertEquals(0, buffer.size());
readUtf8
in interface BufferedSource
java.io.EOFException
public java.lang.String readString(java.nio.charset.Charset charset)
BufferedSource
charset
, and returns the string.readString
in interface BufferedSource
public java.lang.String readString(long byteCount, java.nio.charset.Charset charset) throws java.io.EOFException
BufferedSource
byteCount
bytes from this, decodes them as charset
, and returns the
string.readString
in interface BufferedSource
java.io.EOFException
@Nullable public java.lang.String readUtf8Line() throws java.io.EOFException
BufferedSource
"\n"
or "\r\n"
; these characters are not included in the result.
Buffer buffer = new Buffer()
.writeUtf8("I'm a hacker!\n")
.writeUtf8("That's what I said: you're a nerd.\n")
.writeUtf8("I prefer to be called a hacker!\n");
assertEquals(81, buffer.size());
assertEquals("I'm a hacker!", buffer.readUtf8Line());
assertEquals(67, buffer.size());
assertEquals("That's what I said: you're a nerd.", buffer.readUtf8Line());
assertEquals(32, buffer.size());
assertEquals("I prefer to be called a hacker!", buffer.readUtf8Line());
assertEquals(0, buffer.size());
assertEquals(null, buffer.readUtf8Line());
assertEquals(0, buffer.size());
On the end of the stream this method returns null, just like BufferedReader
. If the source doesn't end with a line break then an implicit line
break is assumed. Null is returned once the source is exhausted. Use this for human-generated
data, where a trailing line break is optional.
readUtf8Line
in interface BufferedSource
java.io.EOFException
public java.lang.String readUtf8LineStrict() throws java.io.EOFException
BufferedSource
"\n"
or "\r\n"
; these characters are not included in the result.
On the end of the stream this method throws. Every call must consume either
'\r\n' or '\n'. If these characters are absent in the stream, an EOFException
is thrown. Use this for machine-generated data where a missing line break implies truncated
input.
readUtf8LineStrict
in interface BufferedSource
java.io.EOFException
public java.lang.String readUtf8LineStrict(long limit) throws java.io.EOFException
BufferedSource
BufferedSource.readUtf8LineStrict()
, except this allows the caller to specify the longest
allowed match. Use this to protect against streams that may not include
"\n"
or "\r\n"
.
The returned string will have at most limit
UTF-8 bytes, and the maximum number
of bytes scanned is limit + 2
. If limit == 0
this will always throw
an EOFException
because no bytes will be scanned.
This method is safe. No bytes are discarded if the match fails, and the caller is free to try another match:
Buffer buffer = new Buffer();
buffer.writeUtf8("12345\r\n");
// This will throw! There must be \r\n or \n at the limit or before it.
buffer.readUtf8LineStrict(4);
// No bytes have been consumed so the caller can retry.
assertEquals("12345", buffer.readUtf8LineStrict(5));
readUtf8LineStrict
in interface BufferedSource
java.io.EOFException
public int readUtf8CodePoint() throws java.io.EOFException
BufferedSource
If this source is exhausted before a complete code point can be read, this throws an EOFException
and consumes no input.
If this source doesn't start with a properly-encoded UTF-8 code point, this method will
remove 1 or more non-UTF-8 bytes and return the replacement character (U+FFFD
). This
covers encoding problems (the input is not properly-encoded UTF-8), characters out of range
(beyond the 0x10ffff limit of Unicode), code points for UTF-16 surrogates (U+d800..U+dfff) and
overlong encodings (such as 0xc080
for the NUL character in modified UTF-8).
readUtf8CodePoint
in interface BufferedSource
java.io.EOFException
public byte[] readByteArray()
BufferedSource
readByteArray
in interface BufferedSource
public byte[] readByteArray(long byteCount) throws java.io.EOFException
BufferedSource
byteCount
bytes from this and returns them as a byte array.readByteArray
in interface BufferedSource
java.io.EOFException
public int read(byte[] sink)
BufferedSource
sink.length
bytes from this and copies them into sink
. Returns
the number of bytes read, or -1 if this source is exhausted.read
in interface BufferedSource
public void readFully(byte[] sink) throws java.io.EOFException
BufferedSource
sink.length
bytes from this and copies them into sink
. Throws
an EOFException
if the requested number of bytes cannot be read.readFully
in interface BufferedSource
java.io.EOFException
public int read(byte[] sink, int offset, int byteCount)
BufferedSource
byteCount
bytes from this and copies them into sink
at offset
. Returns the number of bytes read, or -1 if this source is exhausted.read
in interface BufferedSource
public int read(java.nio.ByteBuffer sink) throws java.io.IOException
read
in interface java.nio.channels.ReadableByteChannel
java.io.IOException
public final void clear()
public void skip(long byteCount) throws java.io.EOFException
byteCount
bytes from the head of this buffer.skip
in interface BufferedSource
java.io.EOFException
public Buffer write(ByteString byteString)
write
in interface BufferedSink
public Buffer writeUtf8(java.lang.String string)
BufferedSink
string
in UTF-8 and writes it to this sink.
Buffer buffer = new Buffer();
buffer.writeUtf8("Uh uh uh!");
buffer.writeByte(' ');
buffer.writeUtf8("You didn't say the magic word!");
assertEquals("Uh uh uh! You didn't say the magic word!", buffer.readUtf8());
writeUtf8
in interface BufferedSink
public Buffer writeUtf8(java.lang.String string, int beginIndex, int endIndex)
BufferedSink
beginIndex
up to endIndex
from string
in
UTF-8 and writes it to this sink.
Buffer buffer = new Buffer();
buffer.writeUtf8("I'm a hacker!\n", 6, 12);
buffer.writeByte(' ');
buffer.writeUtf8("That's what I said: you're a nerd.\n", 29, 33);
buffer.writeByte(' ');
buffer.writeUtf8("I prefer to be called a hacker!\n", 24, 31);
assertEquals("hacker nerd hacker!", buffer.readUtf8());
writeUtf8
in interface BufferedSink
public Buffer writeUtf8CodePoint(int codePoint)
BufferedSink
codePoint
in UTF-8 and writes it to this sink.writeUtf8CodePoint
in interface BufferedSink
public Buffer writeString(java.lang.String string, java.nio.charset.Charset charset)
BufferedSink
string
in charset
and writes it to this sink.writeString
in interface BufferedSink
public Buffer writeString(java.lang.String string, int beginIndex, int endIndex, java.nio.charset.Charset charset)
BufferedSink
beginIndex
up to endIndex
from string
in
charset
and writes it to this sink.writeString
in interface BufferedSink
public Buffer write(byte[] source)
BufferedSink
OutputStream.write(byte[])
, this writes a complete byte array to
this sink.write
in interface BufferedSink
public Buffer write(byte[] source, int offset, int byteCount)
BufferedSink
OutputStream.write(byte[], int, int)
, this writes byteCount
bytes of source
, starting at offset
.write
in interface BufferedSink
public int write(java.nio.ByteBuffer source) throws java.io.IOException
write
in interface java.nio.channels.WritableByteChannel
java.io.IOException
public long writeAll(Source source) throws java.io.IOException
BufferedSink
source
and appends them to this sink. Returns the
number of bytes read which will be 0 if source
is exhausted.writeAll
in interface BufferedSink
java.io.IOException
public BufferedSink write(Source source, long byteCount) throws java.io.IOException
BufferedSink
byteCount
bytes from source
and appends them to this sink.write
in interface BufferedSink
java.io.IOException
public Buffer writeByte(int b)
BufferedSink
writeByte
in interface BufferedSink
public Buffer writeShort(int s)
BufferedSink
Buffer buffer = new Buffer();
buffer.writeShort(32767);
buffer.writeShort(15);
assertEquals(4, buffer.size());
assertEquals((byte) 0x7f, buffer.readByte());
assertEquals((byte) 0xff, buffer.readByte());
assertEquals((byte) 0x00, buffer.readByte());
assertEquals((byte) 0x0f, buffer.readByte());
assertEquals(0, buffer.size());
writeShort
in interface BufferedSink
public Buffer writeShortLe(int s)
BufferedSink
Buffer buffer = new Buffer();
buffer.writeShortLe(32767);
buffer.writeShortLe(15);
assertEquals(4, buffer.size());
assertEquals((byte) 0xff, buffer.readByte());
assertEquals((byte) 0x7f, buffer.readByte());
assertEquals((byte) 0x0f, buffer.readByte());
assertEquals((byte) 0x00, buffer.readByte());
assertEquals(0, buffer.size());
writeShortLe
in interface BufferedSink
public Buffer writeInt(int i)
BufferedSink
Buffer buffer = new Buffer();
buffer.writeInt(2147483647);
buffer.writeInt(15);
assertEquals(8, buffer.size());
assertEquals((byte) 0x7f, buffer.readByte());
assertEquals((byte) 0xff, buffer.readByte());
assertEquals((byte) 0xff, buffer.readByte());
assertEquals((byte) 0xff, buffer.readByte());
assertEquals((byte) 0x00, buffer.readByte());
assertEquals((byte) 0x00, buffer.readByte());
assertEquals((byte) 0x00, buffer.readByte());
assertEquals((byte) 0x0f, buffer.readByte());
assertEquals(0, buffer.size());
writeInt
in interface BufferedSink
public Buffer writeIntLe(int i)
BufferedSink
Buffer buffer = new Buffer();
buffer.writeIntLe(2147483647);
buffer.writeIntLe(15);
assertEquals(8, buffer.size());
assertEquals((byte) 0xff, buffer.readByte());
assertEquals((byte) 0xff, buffer.readByte());
assertEquals((byte) 0xff, buffer.readByte());
assertEquals((byte) 0x7f, buffer.readByte());
assertEquals((byte) 0x0f, buffer.readByte());
assertEquals((byte) 0x00, buffer.readByte());
assertEquals((byte) 0x00, buffer.readByte());
assertEquals((byte) 0x00, buffer.readByte());
assertEquals(0, buffer.size());
writeIntLe
in interface BufferedSink
public Buffer writeLong(long v)
BufferedSink
Buffer buffer = new Buffer();
buffer.writeLong(9223372036854775807L);
buffer.writeLong(15);
assertEquals(16, buffer.size());
assertEquals((byte) 0x7f, buffer.readByte());
assertEquals((byte) 0xff, buffer.readByte());
assertEquals((byte) 0xff, buffer.readByte());
assertEquals((byte) 0xff, buffer.readByte());
assertEquals((byte) 0xff, buffer.readByte());
assertEquals((byte) 0xff, buffer.readByte());
assertEquals((byte) 0xff, buffer.readByte());
assertEquals((byte) 0xff, buffer.readByte());
assertEquals((byte) 0x00, buffer.readByte());
assertEquals((byte) 0x00, buffer.readByte());
assertEquals((byte) 0x00, buffer.readByte());
assertEquals((byte) 0x00, buffer.readByte());
assertEquals((byte) 0x00, buffer.readByte());
assertEquals((byte) 0x00, buffer.readByte());
assertEquals((byte) 0x00, buffer.readByte());
assertEquals((byte) 0x0f, buffer.readByte());
assertEquals(0, buffer.size());
writeLong
in interface BufferedSink
public Buffer writeLongLe(long v)
BufferedSink
Buffer buffer = new Buffer();
buffer.writeLongLe(9223372036854775807L);
buffer.writeLongLe(15);
assertEquals(16, buffer.size());
assertEquals((byte) 0xff, buffer.readByte());
assertEquals((byte) 0xff, buffer.readByte());
assertEquals((byte) 0xff, buffer.readByte());
assertEquals((byte) 0xff, buffer.readByte());
assertEquals((byte) 0xff, buffer.readByte());
assertEquals((byte) 0xff, buffer.readByte());
assertEquals((byte) 0xff, buffer.readByte());
assertEquals((byte) 0x7f, buffer.readByte());
assertEquals((byte) 0x0f, buffer.readByte());
assertEquals((byte) 0x00, buffer.readByte());
assertEquals((byte) 0x00, buffer.readByte());
assertEquals((byte) 0x00, buffer.readByte());
assertEquals((byte) 0x00, buffer.readByte());
assertEquals((byte) 0x00, buffer.readByte());
assertEquals((byte) 0x00, buffer.readByte());
assertEquals((byte) 0x00, buffer.readByte());
assertEquals(0, buffer.size());
writeLongLe
in interface BufferedSink
public Buffer writeDecimalLong(long v)
BufferedSink
Buffer buffer = new Buffer();
buffer.writeDecimalLong(8675309L);
buffer.writeByte(' ');
buffer.writeDecimalLong(-123L);
buffer.writeByte(' ');
buffer.writeDecimalLong(1L);
assertEquals("8675309 -123 1", buffer.readUtf8());
writeDecimalLong
in interface BufferedSink
public Buffer writeHexadecimalUnsignedLong(long v)
BufferedSink
Buffer buffer = new Buffer();
buffer.writeHexadecimalUnsignedLong(65535L);
buffer.writeByte(' ');
buffer.writeHexadecimalUnsignedLong(0xcafebabeL);
buffer.writeByte(' ');
buffer.writeHexadecimalUnsignedLong(0x10L);
assertEquals("ffff cafebabe 10", buffer.readUtf8());
writeHexadecimalUnsignedLong
in interface BufferedSink
public void write(Buffer source, long byteCount)
Sink
byteCount
bytes from source
and appends them to this.public long read(Buffer sink, long byteCount)
Source
byteCount
bytes from this and appends
them to sink
. Returns the number of bytes read, or -1 if this
source is exhausted.public long indexOf(byte b)
BufferedSource
indexOf(b, 0)
.indexOf
in interface BufferedSource
public long indexOf(byte b, long fromIndex)
b
in this at or beyond fromIndex
, or
-1 if this buffer does not contain b
in that range.indexOf
in interface BufferedSource
public long indexOf(byte b, long fromIndex, long toIndex)
BufferedSource
b
if it is found in the range of fromIndex
inclusive
to toIndex
exclusive. If b
isn't found, or if fromIndex == toIndex
,
then -1 is returned.
The scan terminates at either toIndex
or the end of the buffer, whichever comes
first. The maximum number of bytes scanned is toIndex-fromIndex
.
indexOf
in interface BufferedSource
public long indexOf(ByteString bytes) throws java.io.IOException
BufferedSource
indexOf(bytes, 0)
.indexOf
in interface BufferedSource
java.io.IOException
public long indexOf(ByteString bytes, long fromIndex) throws java.io.IOException
BufferedSource
bytes
in the buffer at or after fromIndex
. This expands the buffer as necessary until bytes
is found. This reads an
unbounded number of bytes into the buffer. Returns -1 if the stream is exhausted before the
requested bytes are found.
ByteString MOVE = ByteString.encodeUtf8("move");
Buffer buffer = new Buffer();
buffer.writeUtf8("Don't move! He can't see us if we don't move.");
assertEquals(6, buffer.indexOf(MOVE));
assertEquals(40, buffer.indexOf(MOVE, 12));
indexOf
in interface BufferedSource
java.io.IOException
public long indexOfElement(ByteString targetBytes)
BufferedSource
indexOfElement(targetBytes, 0)
.indexOfElement
in interface BufferedSource
public long indexOfElement(ByteString targetBytes, long fromIndex)
BufferedSource
fromIndex
and that contains
any of the bytes in targetBytes
. This expands the buffer as necessary until a target
byte is found. This reads an unbounded number of bytes into the buffer. Returns -1 if the
stream is exhausted before the requested byte is found.
ByteString ANY_VOWEL = ByteString.encodeUtf8("AEOIUaeoiu");
Buffer buffer = new Buffer();
buffer.writeUtf8("Dr. Alan Grant");
assertEquals(4, buffer.indexOfElement(ANY_VOWEL)); // 'A' in 'Alan'.
assertEquals(11, buffer.indexOfElement(ANY_VOWEL, 9)); // 'a' in 'Grant'.
indexOfElement
in interface BufferedSource
public boolean rangeEquals(long offset, ByteString bytes)
BufferedSource
offset
in this source equal bytes
. This expands
the buffer as necessary until a byte does not match, all bytes are matched, or if the stream
is exhausted before enough bytes could determine a match.
ByteString simonSays = ByteString.encodeUtf8("Simon says:");
Buffer standOnOneLeg = new Buffer().writeUtf8("Simon says: Stand on one leg.");
assertTrue(standOnOneLeg.rangeEquals(0, simonSays));
Buffer payMeMoney = new Buffer().writeUtf8("Pay me $1,000,000.");
assertFalse(payMeMoney.rangeEquals(0, simonSays));
rangeEquals
in interface BufferedSource
public boolean rangeEquals(long offset, ByteString bytes, int bytesOffset, int byteCount)
BufferedSource
byteCount
bytes at offset
in this source equal bytes
at bytesOffset
. This expands the buffer as necessary until a byte does not match, all
bytes are matched, or if the stream is exhausted before enough bytes could determine a match.rangeEquals
in interface BufferedSource
public void flush()
BufferedSink
BufferedSink b0 = new Buffer();
BufferedSink b1 = Okio.buffer(b0);
BufferedSink b2 = Okio.buffer(b1);
b2.writeUtf8("hello");
assertEquals(5, b2.buffer().size());
assertEquals(0, b1.buffer().size());
assertEquals(0, b0.buffer().size());
b2.flush();
assertEquals(0, b2.buffer().size());
assertEquals(0, b1.buffer().size());
assertEquals(5, b0.buffer().size());
flush
in interface java.io.Flushable
flush
in interface BufferedSink
flush
in interface Sink
public boolean isOpen()
isOpen
in interface java.nio.channels.Channel
public void close()
Source
public Timeout timeout()
Source
public final ByteString md5()
public final ByteString sha1()
public final ByteString sha256()
public final ByteString sha512()
public final ByteString hmacSha1(ByteString key)
public final ByteString hmacSha256(ByteString key)
public final ByteString hmacSha512(ByteString key)
public boolean equals(java.lang.Object o)
equals
in class java.lang.Object
public int hashCode()
hashCode
in class java.lang.Object
public java.lang.String toString()
[text=Hello]
or [hex=0000ffff]
.toString
in class java.lang.Object
public Buffer clone()
clone
in class java.lang.Object
public final ByteString snapshot()
public final ByteString snapshot(int byteCount)
byteCount
bytes of this buffer as a byte string.public final Buffer.UnsafeCursor readUnsafe()
public final Buffer.UnsafeCursor readUnsafe(Buffer.UnsafeCursor unsafeCursor)
public final Buffer.UnsafeCursor readAndWriteUnsafe()
public final Buffer.UnsafeCursor readAndWriteUnsafe(Buffer.UnsafeCursor unsafeCursor)
Copyright © 2019. All Rights Reserved.