/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You 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 java.io; /** * Defines an interface for classes that are able to read big-endian typed data from some * source. Typically, this data has been written by a class which implements * {@link DataOutput}. Types that can be read include byte, 16-bit short, 32-bit * int, 32-bit float, 64-bit long, 64-bit double, byte strings, and MUTF-8 * strings. * * <h3>MUTF-8 (Modified UTF-8) Encoding</h3> * <p> * When encoding strings as UTF, implementations of {@code DataInput} and * {@code DataOutput} use a slightly modified form of UTF-8, hereafter referred * to as MUTF-8. This form is identical to standard UTF-8, except: * <ul> * <li>Only the one-, two-, and three-byte encodings are used.</li> * <li>Code points in the range <code>U+10000</code> … * <code>U+10ffff</code> are encoded as a surrogate pair, each of which is * represented as a three-byte encoded value.</li> * <li>The code point <code>U+0000</code> is encoded in two-byte form.</li> * </ul> * <p> * Please refer to <a href="http://unicode.org">The Unicode Standard</a> for * further information about character encoding. MUTF-8 is actually closer to * the (relatively less well-known) encoding <a * href="http://www.unicode.org/reports/tr26/">CESU-8</a> than to UTF-8 per se. * * @see DataInputStream * @see RandomAccessFile */ public interface DataInput { /** * Reads a boolean. * * @return the next boolean value. * @throws EOFException if the end of the input is reached before the read * request can be satisfied. * @throws IOException * if an I/O error occurs while reading. * @see DataOutput#writeBoolean(boolean) */ public abstract boolean readBoolean() throws IOException; /** * Reads an 8-bit byte value. * * @return the next byte value. * @throws EOFException if the end of the input is reached before the read * request can be satisfied. * @throws IOException * if an I/O error occurs while reading. * @see DataOutput#writeByte(int) */ public abstract byte readByte() throws IOException; /** * Reads a big-endian 16-bit character value. * * @return the next char value. * @throws EOFException if the end of the input is reached before the read * request can be satisfied. * @throws IOException * if an I/O error occurs while reading. * @see DataOutput#writeChar(int) */ public abstract char readChar() throws IOException; /** * Reads a big-endian 64-bit double value. * * @return the next double value. * @throws EOFException if the end of the input is reached before the read * request can be satisfied. * @throws IOException * if an I/O error occurs while reading. * @see DataOutput#writeDouble(double) */ public abstract double readDouble() throws IOException; /** * Reads a big-endian 32-bit float value. * * @return the next float value. * @throws EOFException if the end of the input is reached before the read * request can be satisfied. * @throws IOException * if an I/O error occurs while reading. * @see DataOutput#writeFloat(float) */ public abstract float readFloat() throws IOException; /** * Equivalent to {@code readFully(dst, 0, dst.length);}. */ public abstract void readFully(byte[] dst) throws IOException; /** * Reads {@code byteCount} bytes from this stream and stores them in the byte * array {@code dst} starting at {@code offset}. If {@code byteCount} is zero, then this * method returns without reading any bytes. Otherwise, this method blocks until * {@code byteCount} bytes have been read. If insufficient bytes are available, * {@code EOFException} is thrown. If an I/O error occurs, {@code IOException} is * thrown. When an exception is thrown, some bytes may have been consumed from the stream * and written into the array. * * @param dst * the byte array into which the data is read. * @param offset * the offset in {@code dst} at which to store the bytes. * @param byteCount * the number of bytes to read. * @throws EOFException * if the end of the source stream is reached before enough * bytes have been read. * @throws IndexOutOfBoundsException * if {@code offset < 0} or {@code byteCount < 0}, or * {@code offset + byteCount > dst.length}. * @throws IOException * if a problem occurs while reading from this stream. * @throws NullPointerException * if {@code dst} is null. */ public abstract void readFully(byte[] dst, int offset, int byteCount) throws IOException; /** * Reads a big-endian 32-bit integer value. * * @return the next int value. * @throws EOFException if the end of the input is reached before the read * request can be satisfied. * @throws IOException * if an I/O error occurs while reading. * @see DataOutput#writeInt(int) */ public abstract int readInt() throws IOException; /** * Returns a string containing the next line of text available from this * stream. A line is made of zero or more characters followed by {@code * '\n'}, {@code '\r'}, {@code "\r\n"} or the end of the stream. The string * does not include the newline sequence. * * @return the contents of the line or null if no characters have been read * before the end of the stream. * @throws EOFException if the end of the input is reached before the read * request can be satisfied. * @throws IOException * if an I/O error occurs while reading. */ public abstract String readLine() throws IOException; /** * Reads a big-endian 64-bit long value. * * @return the next long value. * @throws EOFException if the end of the input is reached before the read * request can be satisfied. * @throws IOException * if an I/O error occurs while reading. * @see DataOutput#writeLong(long) */ public abstract long readLong() throws IOException; /** * Reads a big-endian 16-bit short value. * * @return the next short value. * @throws EOFException if the end of the input is reached before the read * request can be satisfied. * @throws IOException * if an I/O error occurs while reading. * @see DataOutput#writeShort(int) */ public abstract short readShort() throws IOException; /** * Reads an unsigned 8-bit byte value and returns it as an int. * * @return the next unsigned byte value. * @throws EOFException if the end of the input is reached before the read * request can be satisfied. * @throws IOException * if an I/O error occurs while reading. * @see DataOutput#writeByte(int) */ public abstract int readUnsignedByte() throws IOException; /** * Reads a big-endian 16-bit unsigned short value and returns it as an int. * * @return the next unsigned short value. * @throws EOFException if the end of the input is reached before the read * request can be satisfied. * @throws IOException * if an I/O error occurs while reading. * @see DataOutput#writeShort(int) */ public abstract int readUnsignedShort() throws IOException; /** * Reads a string encoded with {@link DataInput modified UTF-8}. * * @return the next string encoded with {@link DataInput modified UTF-8}. * @throws EOFException if the end of the input is reached before the read * request can be satisfied. * @throws IOException * if an I/O error occurs while reading. * @see DataOutput#writeUTF(java.lang.String) */ public abstract String readUTF() throws IOException; /** * Skips {@code count} number of bytes. This method will not throw an * {@link EOFException} if the end of the input is reached before * {@code count} bytes where skipped. * * @param count * the number of bytes to skip. * @return the number of bytes actually skipped. * @throws IOException * if a problem occurs during skipping. */ public abstract int skipBytes(int count) throws IOException; }