final class RealBufferedSource extends java.lang.Object implements BufferedSource
| Modifier and Type | Field and Description |
|---|---|
Buffer |
buffer |
(package private) boolean |
closed |
Source |
source |
| Constructor and Description |
|---|
RealBufferedSource(Source source) |
| Modifier and Type | Method and Description |
|---|---|
Buffer |
buffer()
Returns this source's internal buffer.
|
void |
close()
Closes this source and releases the resources held by this source.
|
boolean |
exhausted()
Returns true if there are no more bytes in this source.
|
long |
indexOf(byte b)
Equivalent to
indexOf(b, 0). |
long |
indexOf(byte b,
long fromIndex)
Returns the index of the first
b in the buffer at or after fromIndex. |
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() |
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. |
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 '-').
|
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. |
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. |
void |
skip(long byteCount)
Reads and discards
byteCount bytes from this source. |
Timeout |
timeout()
Returns the timeout for this source.
|
java.lang.String |
toString() |
public final Buffer buffer
public final Source source
boolean closed
RealBufferedSource(Source source)
public Buffer buffer()
BufferedSourcebuffer in interface BufferedSourcepublic long read(Buffer sink, long byteCount) throws java.io.IOException
SourcebyteCount bytes from this and appends
them to sink. Returns the number of bytes read, or -1 if this
source is exhausted.public boolean exhausted()
throws java.io.IOException
BufferedSourceexhausted in interface BufferedSourcejava.io.IOExceptionpublic void require(long byteCount)
throws java.io.IOException
BufferedSourcebyteCount bytes. Throws an
EOFException if the source is exhausted before the required bytes can be read.require in interface BufferedSourcejava.io.IOExceptionpublic boolean request(long byteCount)
throws java.io.IOException
BufferedSourcebyteCount bytes, expanding it as
necessary. Returns false if the source is exhausted before the requested bytes can be read.request in interface BufferedSourcejava.io.IOExceptionpublic byte readByte()
throws java.io.IOException
BufferedSourcereadByte in interface BufferedSourcejava.io.IOExceptionpublic ByteString readByteString() throws java.io.IOException
BufferedSourcereadByteString in interface BufferedSourcejava.io.IOExceptionpublic ByteString readByteString(long byteCount) throws java.io.IOException
BufferedSourcebyteCount bytes from this and returns them as a byte string.readByteString in interface BufferedSourcejava.io.IOExceptionpublic int select(Options options) throws java.io.IOException
BufferedSourceoptions 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 BufferedSourcejava.io.IOExceptionpublic byte[] readByteArray()
throws java.io.IOException
BufferedSourcereadByteArray in interface BufferedSourcejava.io.IOExceptionpublic byte[] readByteArray(long byteCount)
throws java.io.IOException
BufferedSourcebyteCount bytes from this and returns them as a byte array.readByteArray in interface BufferedSourcejava.io.IOExceptionpublic int read(byte[] sink)
throws java.io.IOException
BufferedSourcesink.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 BufferedSourcejava.io.IOExceptionpublic void readFully(byte[] sink)
throws java.io.IOException
BufferedSourcesink.length bytes from this and copies them into sink. Throws
an EOFException if the requested number of bytes cannot be read.readFully in interface BufferedSourcejava.io.IOExceptionpublic int read(byte[] sink,
int offset,
int byteCount)
throws java.io.IOException
BufferedSourcebyteCount 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 BufferedSourcejava.io.IOExceptionpublic int read(java.nio.ByteBuffer sink)
throws java.io.IOException
read in interface java.nio.channels.ReadableByteChanneljava.io.IOExceptionpublic void readFully(Buffer sink, long byteCount) throws java.io.IOException
BufferedSourcebyteCount bytes from this and appends them to sink. Throws an
EOFException if the requested number of bytes cannot be read.readFully in interface BufferedSourcejava.io.IOExceptionpublic long readAll(Sink sink) throws java.io.IOException
BufferedSourcesink. Returns the total number of bytes
written to sink which will be 0 if this is exhausted.readAll in interface BufferedSourcejava.io.IOExceptionpublic java.lang.String readUtf8()
throws java.io.IOException
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 BufferedSourcejava.io.IOExceptionpublic java.lang.String readUtf8(long byteCount)
throws java.io.IOException
BufferedSourcebyteCount 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 BufferedSourcejava.io.IOExceptionpublic java.lang.String readString(java.nio.charset.Charset charset)
throws java.io.IOException
BufferedSourcecharset, and returns the string.readString in interface BufferedSourcejava.io.IOExceptionpublic java.lang.String readString(long byteCount,
java.nio.charset.Charset charset)
throws java.io.IOException
BufferedSourcebyteCount bytes from this, decodes them as charset, and returns the
string.readString in interface BufferedSourcejava.io.IOException@Nullable
public java.lang.String readUtf8Line()
throws java.io.IOException
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 BufferedSourcejava.io.IOExceptionpublic java.lang.String readUtf8LineStrict()
throws java.io.IOException
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 BufferedSourcejava.io.IOExceptionpublic java.lang.String readUtf8LineStrict(long limit)
throws java.io.IOException
BufferedSourceBufferedSource.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 BufferedSourcejava.io.IOExceptionpublic int readUtf8CodePoint()
throws java.io.IOException
BufferedSourceIf 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 BufferedSourcejava.io.IOExceptionpublic short readShort()
throws java.io.IOException
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 BufferedSourcejava.io.IOExceptionpublic short readShortLe()
throws java.io.IOException
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 BufferedSourcejava.io.IOExceptionpublic int readInt()
throws java.io.IOException
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 BufferedSourcejava.io.IOExceptionpublic int readIntLe()
throws java.io.IOException
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 BufferedSourcejava.io.IOExceptionpublic long readLong()
throws java.io.IOException
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 BufferedSourcejava.io.IOExceptionpublic long readLongLe()
throws java.io.IOException
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 BufferedSourcejava.io.IOExceptionpublic long readDecimalLong()
throws java.io.IOException
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 BufferedSourcejava.io.IOExceptionpublic long readHexadecimalUnsignedLong()
throws java.io.IOException
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 BufferedSourcejava.io.IOExceptionpublic void skip(long byteCount)
throws java.io.IOException
BufferedSourcebyteCount bytes from this source. Throws an
EOFException if the source is exhausted before the
requested bytes can be skipped.skip in interface BufferedSourcejava.io.IOExceptionpublic long indexOf(byte b)
throws java.io.IOException
BufferedSourceindexOf(b, 0).indexOf in interface BufferedSourcejava.io.IOExceptionpublic long indexOf(byte b,
long fromIndex)
throws java.io.IOException
BufferedSourceb in the buffer at or after fromIndex. This
expands the buffer as necessary until b 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.
Buffer buffer = new Buffer();
buffer.writeUtf8("Don't move! He can't see us if we don't move.");
byte m = 'm';
assertEquals(6, buffer.indexOf(m));
assertEquals(40, buffer.indexOf(m, 12));
indexOf in interface BufferedSourcejava.io.IOExceptionpublic long indexOf(byte b,
long fromIndex,
long toIndex)
throws java.io.IOException
BufferedSourceb 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 BufferedSourcejava.io.IOExceptionpublic long indexOf(ByteString bytes) throws java.io.IOException
BufferedSourceindexOf(bytes, 0).indexOf in interface BufferedSourcejava.io.IOExceptionpublic long indexOf(ByteString bytes, long fromIndex) throws java.io.IOException
BufferedSourcebytes 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 BufferedSourcejava.io.IOExceptionpublic long indexOfElement(ByteString targetBytes) throws java.io.IOException
BufferedSourceindexOfElement(targetBytes, 0).indexOfElement in interface BufferedSourcejava.io.IOExceptionpublic long indexOfElement(ByteString targetBytes, long fromIndex) throws java.io.IOException
BufferedSourcefromIndex 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 BufferedSourcejava.io.IOExceptionpublic boolean rangeEquals(long offset,
ByteString bytes)
throws java.io.IOException
BufferedSourceoffset 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 BufferedSourcejava.io.IOExceptionpublic boolean rangeEquals(long offset,
ByteString bytes,
int bytesOffset,
int byteCount)
throws java.io.IOException
BufferedSourcebyteCount 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 BufferedSourcejava.io.IOExceptionpublic java.io.InputStream inputStream()
BufferedSourceinputStream in interface BufferedSourcepublic boolean isOpen()
isOpen in interface java.nio.channels.Channelpublic void close()
throws java.io.IOException
Sourcepublic Timeout timeout()
Sourcepublic java.lang.String toString()
toString in class java.lang.Object