Class Buffer
- java.lang.Object
-
- okio.Buffer
-
- All Implemented Interfaces:
Closeable
,Flushable
,AutoCloseable
,Cloneable
,ByteChannel
,Channel
,ReadableByteChannel
,WritableByteChannel
,BufferedSink
,BufferedSource
,Sink
,Source
public final class Buffer extends Object implements BufferedSource, BufferedSink, Cloneable, ByteChannel
A collection of bytes in memory.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.
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description static class
Buffer.UnsafeCursor
A handle to the underlying data in a buffer.
-
Constructor Summary
Constructors Constructor Description Buffer()
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method 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(OutputStream out)
Copy the contents of this toout
.Buffer
copyTo(OutputStream out, long offset, long byteCount)
CopybyteCount
bytes from this, starting atoffset
, toout
.Buffer
copyTo(Buffer out, long offset, long byteCount)
CopybyteCount
bytes from this, starting atoffset
, toout
.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(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 atpos
.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 toindexOf(b, 0)
.long
indexOf(byte b, long fromIndex)
Returns the index ofb
in this at or beyondfromIndex
, or -1 if this buffer does not containb
in that range.long
indexOf(byte b, long fromIndex, long toIndex)
Returns the index ofb
if it is found in the range offromIndex
inclusive totoIndex
exclusive.long
indexOf(ByteString bytes)
Equivalent toindexOf(bytes, 0)
.long
indexOf(ByteString bytes, long fromIndex)
Returns the index of the first match forbytes
in the buffer at or afterfromIndex
.long
indexOfElement(ByteString targetBytes)
Equivalent toindexOfElement(targetBytes, 0)
.long
indexOfElement(ByteString targetBytes, long fromIndex)
Returns the first index in this buffer that is at or afterfromIndex
and that contains any of the bytes intargetBytes
.InputStream
inputStream()
Returns an input stream that reads from this source.boolean
isOpen()
ByteString
md5()
Returns the 128-bit MD5 hash of this buffer.OutputStream
outputStream()
Returns an output stream that writes to this sink.BufferedSource
peek()
Returns a newBufferedSource
that can read data from thisBufferedSource
without consuming it.boolean
rangeEquals(long offset, ByteString bytes)
Returns true if the bytes atoffset
in this source equalbytes
.boolean
rangeEquals(long offset, ByteString bytes, int bytesOffset, int byteCount)
Returns true ifbyteCount
bytes atoffset
in this source equalbytes
atbytesOffset
.int
read(byte[] sink)
Removes up tosink.length
bytes from this and copies them intosink
.int
read(byte[] sink, int offset, int byteCount)
Removes up tobyteCount
bytes from this and copies them intosink
atoffset
.int
read(ByteBuffer sink)
long
read(Buffer sink, long byteCount)
Removes at least 1, and up tobyteCount
bytes from this and appends them tosink
.long
readAll(Sink sink)
Removes all bytes from this and appends them tosink
.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)
RemovesbyteCount
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)
RemovesbyteCount
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(InputStream in)
Read and exhaust bytes fromin
to this.Buffer
readFrom(InputStream in, long byteCount)
ReadbyteCount
bytes fromin
to this.void
readFully(byte[] sink)
Removes exactlysink.length
bytes from this and copies them intosink
.void
readFully(Buffer sink, long byteCount)
Removes exactlybyteCount
bytes from this and appends them tosink
.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.String
readString(long byteCount, Charset charset)
RemovesbyteCount
bytes from this, decodes them ascharset
, and returns the string.String
readString(Charset charset)
Removes all bytes from this, decodes them ascharset
, and returns the string.Buffer.UnsafeCursor
readUnsafe()
Buffer.UnsafeCursor
readUnsafe(Buffer.UnsafeCursor unsafeCursor)
String
readUtf8()
Removes all bytes from this, decodes them as UTF-8, and returns the string.String
readUtf8(long byteCount)
RemovesbyteCount
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.String
readUtf8Line()
Removes and returns characters up to but not including the next line break.String
readUtf8LineStrict()
Removes and returns characters up to but not including the next line break.String
readUtf8LineStrict(long limit)
LikeBufferedSource.readUtf8LineStrict()
, except this allows the caller to specify the longest allowed match.boolean
request(long byteCount)
Returns true when the buffer contains at leastbyteCount
bytes, expanding it as necessary.void
require(long byteCount)
Returns when the buffer contains at leastbyteCount
bytes.int
select(Options options)
Finds the first string inoptions
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)
DiscardsbyteCount
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 firstbyteCount
bytes of this buffer as a byte string.Timeout
timeout()
Returns the timeout for this source.String
toString()
Returns a human-readable string that describes the contents of this buffer.Buffer
write(byte[] source)
LikeOutputStream.write(byte[])
, this writes a complete byte array to this sink.Buffer
write(byte[] source, int offset, int byteCount)
LikeOutputStream.write(byte[], int, int)
, this writesbyteCount
bytes ofsource
, starting atoffset
.int
write(ByteBuffer source)
void
write(Buffer source, long byteCount)
RemovesbyteCount
bytes fromsource
and appends them to this.Buffer
write(ByteString byteString)
BufferedSink
write(Source source, long byteCount)
RemovesbyteCount
bytes fromsource
and appends them to this sink.long
writeAll(Source source)
Removes all bytes fromsource
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(String string, int beginIndex, int endIndex, Charset charset)
Encodes the characters atbeginIndex
up toendIndex
fromstring
incharset
and writes it to this sink.Buffer
writeString(String string, Charset charset)
Encodesstring
incharset
and writes it to this sink.Buffer
writeTo(OutputStream out)
Write the contents of this toout
.Buffer
writeTo(OutputStream out, long byteCount)
WritebyteCount
bytes from this toout
.Buffer
writeUtf8(String string)
Encodesstring
in UTF-8 and writes it to this sink.Buffer
writeUtf8(String string, int beginIndex, int endIndex)
Encodes the characters atbeginIndex
up toendIndex
fromstring
in UTF-8 and writes it to this sink.Buffer
writeUtf8CodePoint(int codePoint)
EncodescodePoint
in UTF-8 and writes it to this sink.
-
-
-
Method Detail
-
size
public final long size()
Returns the number of bytes currently in this buffer.
-
buffer
public Buffer buffer()
Description copied from interface:BufferedSource
Returns this source's internal buffer.- Specified by:
buffer
in interfaceBufferedSink
- Specified by:
buffer
in interfaceBufferedSource
-
getBuffer
public Buffer getBuffer()
Description copied from interface:BufferedSource
This source's internal buffer.- Specified by:
getBuffer
in interfaceBufferedSource
-
outputStream
public OutputStream outputStream()
Description copied from interface:BufferedSink
Returns an output stream that writes to this sink.- Specified by:
outputStream
in interfaceBufferedSink
-
emitCompleteSegments
public Buffer emitCompleteSegments()
Description copied from interface:BufferedSink
Writes complete segments to the underlying sink, if one exists. LikeBufferedSink.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.
- Specified by:
emitCompleteSegments
in interfaceBufferedSink
-
emit
public BufferedSink emit()
Description copied from interface:BufferedSink
Writes all buffered data to the underlying sink, if one exists. LikeBufferedSink.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());
- Specified by:
emit
in interfaceBufferedSink
-
exhausted
public boolean exhausted()
Description copied from interface:BufferedSource
Returns true if there are no more bytes in this source. This will block until there are bytes to read or the source is definitely exhausted.- Specified by:
exhausted
in interfaceBufferedSource
-
require
public void require(long byteCount) throws EOFException
Description copied from interface:BufferedSource
Returns when the buffer contains at leastbyteCount
bytes. Throws anEOFException
if the source is exhausted before the required bytes can be read.- Specified by:
require
in interfaceBufferedSource
- Throws:
EOFException
-
request
public boolean request(long byteCount)
Description copied from interface:BufferedSource
Returns true when the buffer contains at leastbyteCount
bytes, expanding it as necessary. Returns false if the source is exhausted before the requested bytes can be read.- Specified by:
request
in interfaceBufferedSource
-
peek
public BufferedSource peek()
Description copied from interface:BufferedSource
Returns a newBufferedSource
that can read data from thisBufferedSource
without consuming it. The returned source becomes invalid once this source is next read or closed. For example, we can usepeek()
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"
- Specified by:
peek
in interfaceBufferedSource
-
inputStream
public InputStream inputStream()
Description copied from interface:BufferedSource
Returns an input stream that reads from this source.- Specified by:
inputStream
in interfaceBufferedSource
-
copyTo
public final Buffer copyTo(OutputStream out) throws IOException
Copy the contents of this toout
.- Throws:
IOException
-
copyTo
public final Buffer copyTo(OutputStream out, long offset, long byteCount) throws IOException
CopybyteCount
bytes from this, starting atoffset
, toout
.- Throws:
IOException
-
copyTo
public final Buffer copyTo(Buffer out, long offset, long byteCount)
CopybyteCount
bytes from this, starting atoffset
, toout
.
-
writeTo
public final Buffer writeTo(OutputStream out) throws IOException
Write the contents of this toout
.- Throws:
IOException
-
writeTo
public final Buffer writeTo(OutputStream out, long byteCount) throws IOException
WritebyteCount
bytes from this toout
.- Throws:
IOException
-
readFrom
public final Buffer readFrom(InputStream in) throws IOException
Read and exhaust bytes fromin
to this.- Throws:
IOException
-
readFrom
public final Buffer readFrom(InputStream in, long byteCount) throws IOException
ReadbyteCount
bytes fromin
to this.- Throws:
IOException
-
completeSegmentByteCount
public final long completeSegmentByteCount()
Returns the number of bytes in segments that are not writable. This is the number of bytes that can be flushed immediately to an underlying sink without harming throughput.
-
readByte
public byte readByte()
Description copied from interface:BufferedSource
Removes a byte from this source and returns it.- Specified by:
readByte
in interfaceBufferedSource
-
getByte
public final byte getByte(long pos)
Returns the byte atpos
.
-
readShort
public short readShort()
Description copied from interface:BufferedSource
Removes two bytes from this source and returns a big-endian short.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());
- Specified by:
readShort
in interfaceBufferedSource
-
readInt
public int readInt()
Description copied from interface:BufferedSource
Removes four bytes from this source and returns a big-endian int.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());
- Specified by:
readInt
in interfaceBufferedSource
-
readLong
public long readLong()
Description copied from interface:BufferedSource
Removes eight bytes from this source and returns a big-endian long.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());
- Specified by:
readLong
in interfaceBufferedSource
-
readShortLe
public short readShortLe()
Description copied from interface:BufferedSource
Removes two bytes from this source and returns a little-endian short.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());
- Specified by:
readShortLe
in interfaceBufferedSource
-
readIntLe
public int readIntLe()
Description copied from interface:BufferedSource
Removes four bytes from this source and returns a little-endian int.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());
- Specified by:
readIntLe
in interfaceBufferedSource
-
readLongLe
public long readLongLe()
Description copied from interface:BufferedSource
Removes eight bytes from this source and returns a little-endian long.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());
- Specified by:
readLongLe
in interfaceBufferedSource
-
readDecimalLong
public long readDecimalLong()
Description copied from interface:BufferedSource
Reads a long from this source in signed decimal form (i.e., as a string in base 10 with optional leading '-'). This will iterate until a non-digit character is found.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());
- Specified by:
readDecimalLong
in interfaceBufferedSource
-
readHexadecimalUnsignedLong
public long readHexadecimalUnsignedLong()
Description copied from interface:BufferedSource
Reads a long form this source in hexadecimal form (i.e., as a string in base 16). This will iterate until a non-hexadecimal character is found.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());
- Specified by:
readHexadecimalUnsignedLong
in interfaceBufferedSource
-
readByteString
public ByteString readByteString()
Description copied from interface:BufferedSource
Removes all bytes bytes from this and returns them as a byte string.- Specified by:
readByteString
in interfaceBufferedSource
-
readByteString
public ByteString readByteString(long byteCount) throws EOFException
Description copied from interface:BufferedSource
RemovesbyteCount
bytes from this and returns them as a byte string.- Specified by:
readByteString
in interfaceBufferedSource
- Throws:
EOFException
-
select
public int select(Options options)
Description copied from interface:BufferedSource
Finds the first string inoptions
that is a prefix of this buffer, consumes it from this buffer, and returns its index. If no byte string inoptions
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 evenBufferedSource.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());
- Specified by:
select
in interfaceBufferedSource
-
readFully
public void readFully(Buffer sink, long byteCount) throws EOFException
Description copied from interface:BufferedSource
Removes exactlybyteCount
bytes from this and appends them tosink
. Throws anEOFException
if the requested number of bytes cannot be read.- Specified by:
readFully
in interfaceBufferedSource
- Throws:
EOFException
-
readAll
public long readAll(Sink sink) throws IOException
Description copied from interface:BufferedSource
Removes all bytes from this and appends them tosink
. Returns the total number of bytes written tosink
which will be 0 if this is exhausted.- Specified by:
readAll
in interfaceBufferedSource
- Throws:
IOException
-
readUtf8
public String readUtf8()
Description copied from interface:BufferedSource
Removes all bytes from this, decodes them as UTF-8, and returns the string. Returns the empty string if this source is empty.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());
- Specified by:
readUtf8
in interfaceBufferedSource
-
readUtf8
public String readUtf8(long byteCount) throws EOFException
Description copied from interface:BufferedSource
RemovesbyteCount
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());
- Specified by:
readUtf8
in interfaceBufferedSource
- Throws:
EOFException
-
readString
public String readString(Charset charset)
Description copied from interface:BufferedSource
Removes all bytes from this, decodes them ascharset
, and returns the string.- Specified by:
readString
in interfaceBufferedSource
-
readString
public String readString(long byteCount, Charset charset) throws EOFException
Description copied from interface:BufferedSource
RemovesbyteCount
bytes from this, decodes them ascharset
, and returns the string.- Specified by:
readString
in interfaceBufferedSource
- Throws:
EOFException
-
readUtf8Line
@Nullable public String readUtf8Line() throws EOFException
Description copied from interface:BufferedSource
Removes and returns characters up to but not including the next line break. A line break is either"\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.- Specified by:
readUtf8Line
in interfaceBufferedSource
- Throws:
EOFException
-
readUtf8LineStrict
public String readUtf8LineStrict() throws EOFException
Description copied from interface:BufferedSource
Removes and returns characters up to but not including the next line break. A line break is either"\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.- Specified by:
readUtf8LineStrict
in interfaceBufferedSource
- Throws:
EOFException
-
readUtf8LineStrict
public String readUtf8LineStrict(long limit) throws EOFException
Description copied from interface:BufferedSource
LikeBufferedSource.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 islimit + 2
. Iflimit == 0
this will always throw anEOFException
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));
- Specified by:
readUtf8LineStrict
in interfaceBufferedSource
- Throws:
EOFException
-
readUtf8CodePoint
public int readUtf8CodePoint() throws EOFException
Description copied from interface:BufferedSource
Removes and returns a single UTF-8 code point, reading between 1 and 4 bytes as necessary.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 as0xc080
for the NUL character in modified UTF-8).- Specified by:
readUtf8CodePoint
in interfaceBufferedSource
- Throws:
EOFException
-
readByteArray
public byte[] readByteArray()
Description copied from interface:BufferedSource
Removes all bytes from this and returns them as a byte array.- Specified by:
readByteArray
in interfaceBufferedSource
-
readByteArray
public byte[] readByteArray(long byteCount) throws EOFException
Description copied from interface:BufferedSource
RemovesbyteCount
bytes from this and returns them as a byte array.- Specified by:
readByteArray
in interfaceBufferedSource
- Throws:
EOFException
-
read
public int read(byte[] sink)
Description copied from interface:BufferedSource
Removes up tosink.length
bytes from this and copies them intosink
. Returns the number of bytes read, or -1 if this source is exhausted.- Specified by:
read
in interfaceBufferedSource
-
readFully
public void readFully(byte[] sink) throws EOFException
Description copied from interface:BufferedSource
Removes exactlysink.length
bytes from this and copies them intosink
. Throws anEOFException
if the requested number of bytes cannot be read.- Specified by:
readFully
in interfaceBufferedSource
- Throws:
EOFException
-
read
public int read(byte[] sink, int offset, int byteCount)
Description copied from interface:BufferedSource
Removes up tobyteCount
bytes from this and copies them intosink
atoffset
. Returns the number of bytes read, or -1 if this source is exhausted.- Specified by:
read
in interfaceBufferedSource
-
read
public int read(ByteBuffer sink) throws IOException
- Specified by:
read
in interfaceReadableByteChannel
- Throws:
IOException
-
clear
public final void clear()
Discards all bytes in this buffer. Calling this method when you're done with a buffer will return its segments to the pool.
-
skip
public void skip(long byteCount) throws EOFException
DiscardsbyteCount
bytes from the head of this buffer.- Specified by:
skip
in interfaceBufferedSource
- Throws:
EOFException
-
write
public Buffer write(ByteString byteString)
- Specified by:
write
in interfaceBufferedSink
-
writeUtf8
public Buffer writeUtf8(String string)
Description copied from interface:BufferedSink
Encodesstring
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());
- Specified by:
writeUtf8
in interfaceBufferedSink
-
writeUtf8
public Buffer writeUtf8(String string, int beginIndex, int endIndex)
Description copied from interface:BufferedSink
Encodes the characters atbeginIndex
up toendIndex
fromstring
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());
- Specified by:
writeUtf8
in interfaceBufferedSink
-
writeUtf8CodePoint
public Buffer writeUtf8CodePoint(int codePoint)
Description copied from interface:BufferedSink
EncodescodePoint
in UTF-8 and writes it to this sink.- Specified by:
writeUtf8CodePoint
in interfaceBufferedSink
-
writeString
public Buffer writeString(String string, Charset charset)
Description copied from interface:BufferedSink
Encodesstring
incharset
and writes it to this sink.- Specified by:
writeString
in interfaceBufferedSink
-
writeString
public Buffer writeString(String string, int beginIndex, int endIndex, Charset charset)
Description copied from interface:BufferedSink
Encodes the characters atbeginIndex
up toendIndex
fromstring
incharset
and writes it to this sink.- Specified by:
writeString
in interfaceBufferedSink
-
write
public Buffer write(byte[] source)
Description copied from interface:BufferedSink
LikeOutputStream.write(byte[])
, this writes a complete byte array to this sink.- Specified by:
write
in interfaceBufferedSink
-
write
public Buffer write(byte[] source, int offset, int byteCount)
Description copied from interface:BufferedSink
LikeOutputStream.write(byte[], int, int)
, this writesbyteCount
bytes ofsource
, starting atoffset
.- Specified by:
write
in interfaceBufferedSink
-
write
public int write(ByteBuffer source) throws IOException
- Specified by:
write
in interfaceWritableByteChannel
- Throws:
IOException
-
writeAll
public long writeAll(Source source) throws IOException
Description copied from interface:BufferedSink
Removes all bytes fromsource
and appends them to this sink. Returns the number of bytes read which will be 0 ifsource
is exhausted.- Specified by:
writeAll
in interfaceBufferedSink
- Throws:
IOException
-
write
public BufferedSink write(Source source, long byteCount) throws IOException
Description copied from interface:BufferedSink
RemovesbyteCount
bytes fromsource
and appends them to this sink.- Specified by:
write
in interfaceBufferedSink
- Throws:
IOException
-
writeByte
public Buffer writeByte(int b)
Description copied from interface:BufferedSink
Writes a byte to this sink.- Specified by:
writeByte
in interfaceBufferedSink
-
writeShort
public Buffer writeShort(int s)
Description copied from interface:BufferedSink
Writes a big-endian short to this sink using two bytes.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());
- Specified by:
writeShort
in interfaceBufferedSink
-
writeShortLe
public Buffer writeShortLe(int s)
Description copied from interface:BufferedSink
Writes a little-endian short to this sink using two bytes.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());
- Specified by:
writeShortLe
in interfaceBufferedSink
-
writeInt
public Buffer writeInt(int i)
Description copied from interface:BufferedSink
Writes a big-endian int to this sink using four bytes.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());
- Specified by:
writeInt
in interfaceBufferedSink
-
writeIntLe
public Buffer writeIntLe(int i)
Description copied from interface:BufferedSink
Writes a little-endian int to this sink using four bytes.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());
- Specified by:
writeIntLe
in interfaceBufferedSink
-
writeLong
public Buffer writeLong(long v)
Description copied from interface:BufferedSink
Writes a big-endian long to this sink using eight bytes.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());
- Specified by:
writeLong
in interfaceBufferedSink
-
writeLongLe
public Buffer writeLongLe(long v)
Description copied from interface:BufferedSink
Writes a little-endian long to this sink using eight bytes.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());
- Specified by:
writeLongLe
in interfaceBufferedSink
-
writeDecimalLong
public Buffer writeDecimalLong(long v)
Description copied from interface:BufferedSink
Writes a long to this sink in signed decimal form (i.e., as a string in base 10).Buffer buffer = new Buffer(); buffer.writeDecimalLong(8675309L); buffer.writeByte(' '); buffer.writeDecimalLong(-123L); buffer.writeByte(' '); buffer.writeDecimalLong(1L); assertEquals("8675309 -123 1", buffer.readUtf8());
- Specified by:
writeDecimalLong
in interfaceBufferedSink
-
writeHexadecimalUnsignedLong
public Buffer writeHexadecimalUnsignedLong(long v)
Description copied from interface:BufferedSink
Writes a long to this sink in hexadecimal form (i.e., as a string in base 16).Buffer buffer = new Buffer(); buffer.writeHexadecimalUnsignedLong(65535L); buffer.writeByte(' '); buffer.writeHexadecimalUnsignedLong(0xcafebabeL); buffer.writeByte(' '); buffer.writeHexadecimalUnsignedLong(0x10L); assertEquals("ffff cafebabe 10", buffer.readUtf8());
- Specified by:
writeHexadecimalUnsignedLong
in interfaceBufferedSink
-
write
public void write(Buffer source, long byteCount)
Description copied from interface:Sink
RemovesbyteCount
bytes fromsource
and appends them to this.
-
read
public long read(Buffer sink, long byteCount)
Description copied from interface:Source
Removes at least 1, and up tobyteCount
bytes from this and appends them tosink
. Returns the number of bytes read, or -1 if this source is exhausted.
-
indexOf
public long indexOf(byte b)
Description copied from interface:BufferedSource
Equivalent toindexOf(b, 0)
.- Specified by:
indexOf
in interfaceBufferedSource
-
indexOf
public long indexOf(byte b, long fromIndex)
Returns the index ofb
in this at or beyondfromIndex
, or -1 if this buffer does not containb
in that range.- Specified by:
indexOf
in interfaceBufferedSource
-
indexOf
public long indexOf(byte b, long fromIndex, long toIndex)
Description copied from interface:BufferedSource
Returns the index ofb
if it is found in the range offromIndex
inclusive totoIndex
exclusive. Ifb
isn't found, or iffromIndex == 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 istoIndex-fromIndex
.- Specified by:
indexOf
in interfaceBufferedSource
-
indexOf
public long indexOf(ByteString bytes) throws IOException
Description copied from interface:BufferedSource
Equivalent toindexOf(bytes, 0)
.- Specified by:
indexOf
in interfaceBufferedSource
- Throws:
IOException
-
indexOf
public long indexOf(ByteString bytes, long fromIndex) throws IOException
Description copied from interface:BufferedSource
Returns the index of the first match forbytes
in the buffer at or afterfromIndex
. This expands the buffer as necessary untilbytes
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));
- Specified by:
indexOf
in interfaceBufferedSource
- Throws:
IOException
-
indexOfElement
public long indexOfElement(ByteString targetBytes)
Description copied from interface:BufferedSource
Equivalent toindexOfElement(targetBytes, 0)
.- Specified by:
indexOfElement
in interfaceBufferedSource
-
indexOfElement
public long indexOfElement(ByteString targetBytes, long fromIndex)
Description copied from interface:BufferedSource
Returns the first index in this buffer that is at or afterfromIndex
and that contains any of the bytes intargetBytes
. 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'.
- Specified by:
indexOfElement
in interfaceBufferedSource
-
rangeEquals
public boolean rangeEquals(long offset, ByteString bytes)
Description copied from interface:BufferedSource
Returns true if the bytes atoffset
in this source equalbytes
. 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));
- Specified by:
rangeEquals
in interfaceBufferedSource
-
rangeEquals
public boolean rangeEquals(long offset, ByteString bytes, int bytesOffset, int byteCount)
Description copied from interface:BufferedSource
Returns true ifbyteCount
bytes atoffset
in this source equalbytes
atbytesOffset
. 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.- Specified by:
rangeEquals
in interfaceBufferedSource
-
flush
public void flush()
Description copied from interface:BufferedSink
Writes all buffered data to the underlying sink, if one exists. Then that sink is recursively flushed which pushes data as far as possible towards its ultimate destination. Typically that destination is a network socket or file.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());
-
close
public void close()
Description copied from interface:Source
Closes this source and releases the resources held by this source. It is an error to read a closed source. It is safe to close a source more than once.
-
timeout
public Timeout timeout()
Description copied from interface:Source
Returns the timeout for this source.
-
md5
public final ByteString md5()
Returns the 128-bit MD5 hash of this buffer.
-
sha1
public final ByteString sha1()
Returns the 160-bit SHA-1 hash of this buffer.
-
sha256
public final ByteString sha256()
Returns the 256-bit SHA-256 hash of this buffer.
-
sha512
public final ByteString sha512()
Returns the 512-bit SHA-512 hash of this buffer.
-
hmacSha1
public final ByteString hmacSha1(ByteString key)
Returns the 160-bit SHA-1 HMAC of this buffer.
-
hmacSha256
public final ByteString hmacSha256(ByteString key)
Returns the 256-bit SHA-256 HMAC of this buffer.
-
hmacSha512
public final ByteString hmacSha512(ByteString key)
Returns the 512-bit SHA-512 HMAC of this buffer.
-
toString
public String toString()
Returns a human-readable string that describes the contents of this buffer. Typically this is a string like[text=Hello]
or[hex=0000ffff]
.
-
snapshot
public final ByteString snapshot()
Returns an immutable copy of this buffer as a byte string.
-
snapshot
public final ByteString snapshot(int byteCount)
Returns an immutable copy of the firstbyteCount
bytes of this buffer as a byte string.
-
readUnsafe
public final Buffer.UnsafeCursor readUnsafe()
-
readUnsafe
public final Buffer.UnsafeCursor readUnsafe(Buffer.UnsafeCursor unsafeCursor)
-
readAndWriteUnsafe
public final Buffer.UnsafeCursor readAndWriteUnsafe()
-
readAndWriteUnsafe
public final Buffer.UnsafeCursor readAndWriteUnsafe(Buffer.UnsafeCursor unsafeCursor)
-
-