/* * Copyright (C) 2014 Square, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package okio; import java.io.IOException; import java.io.InputStream; /** * A source that keeps a buffer internally so that callers can do small reads * without a performance penalty. It also allows clients to read ahead, * buffering as much as necessary before consuming input. */ public interface BufferedSource extends Source { /** Returns this source's internal buffer. */ OkBuffer buffer(); /** * 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. */ boolean exhausted() throws IOException; /** * Returns when the buffer contains at least {@code byteCount} bytes. Throws * an {@link java.io.EOFException} if the source is exhausted before the * required bytes can be read. */ void require(long byteCount) throws IOException; /** Removes a byte from this source and returns it. */ byte readByte() throws IOException; /** Removes two bytes from this source and returns a big-endian short. */ short readShort() throws IOException; /** Removes two bytes from this source and returns a little-endian short. */ short readShortLe() throws IOException; /** Removes four bytes from this source and returns a big-endian int. */ int readInt() throws IOException; /** Removes four bytes from this source and returns a little-endian int. */ int readIntLe() throws IOException; /** Removes eight bytes from this source and returns a big-endian long. */ long readLong() throws IOException; /** Removes eight bytes from this source and returns a little-endian long. */ long readLongLe() throws IOException; /** * Reads and discards {@code byteCount} bytes from this source. Throws an * {@link java.io.EOFException} if the source is exhausted before the * requested bytes can be skipped. */ void skip(long byteCount) throws IOException; /** Removes {@code byteCount} bytes from this and returns them as a byte string. */ ByteString readByteString(long byteCount) throws IOException; /** * Removes {@code byteCount} bytes from this, decodes them as UTF-8 and * returns the string. */ String readUtf8(long byteCount) throws IOException; /** * Removes and returns characters up to but not including the next line break. * A line break is either {@code "\n"} or {@code "\r\n"}; these characters are * not included in the result. * * <p><strong>On the end of the stream this method returns null,</strong> just * like {@link java.io.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. */ String readUtf8Line() throws IOException; /** * Removes and returns characters up to but not including the next line break. * A line break is either {@code "\n"} or {@code "\r\n"}; these characters are * not included in the result. * * <p><strong>On the end of the stream this method throws.</strong> Every call * must consume either '\r\n' or '\n'. If these characters are absent in the * stream, an {@link java.io.EOFException} is thrown. Use this for * machine-generated data where a missing line break implies truncated input. */ String readUtf8LineStrict() throws IOException; /** * Returns the index of {@code b} in the buffer, refilling it if necessary * until it 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. */ long indexOf(byte b) throws IOException; /** Returns an input stream that reads from this source. */ InputStream inputStream(); }