/*
 *  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 allow reading serialized objects.
 *
 * @see ObjectInputStream
 * @see ObjectOutput
 */
public interface ObjectInput extends DataInput {
    /**
     * Indicates the number of bytes of primitive data that can be read without
     * blocking.
     *
     * @return the number of bytes available.
     * @throws IOException
     *             if an I/O error occurs.
     */
    public int available() throws IOException;

    /**
     * Closes this stream. Implementations of this method should free any
     * resources used by the stream.
     *
     * @throws IOException
     *             if an I/O error occurs while closing the input stream.
     */
    public void close() throws IOException;

    /**
     * Reads a single byte from this stream and returns it as an integer in the
     * range from 0 to 255. Returns -1 if the end of this stream has been
     * reached. Blocks if no input is available.
     *
     * @return the byte read or -1 if the end of this stream has been reached.
     * @throws IOException
     *             if this stream is closed or another I/O error occurs.
     */
    public int read() throws IOException;

    /**
     * Reads bytes from this stream into the byte array {@code buffer}. Blocks
     * while waiting for input.
     *
     * @param buffer
     *            the array in which to store the bytes read.
     * @return the number of bytes read or -1 if the end of this stream has been
     *         reached.
     * @throws IOException
     *             if this stream is closed or another I/O error occurs.
     */
    public int read(byte[] buffer) throws IOException;

    /**
     * Reads at most {@code count} bytes from this stream and stores them in
     * byte array {@code buffer} starting at offset {@code count}. Blocks while
     * waiting for input.
     *
     * @param buffer
     *            the array in which to store the bytes read.
     * @param offset
     *            the initial position in {@code buffer} to store the bytes read
     *            from this stream.
     * @param count
     *            the maximum number of bytes to store in {@code buffer}.
     * @return the number of bytes read or -1 if the end of this stream has been
     *         reached.
     * @throws IOException
     *             if this stream is closed or another I/O error occurs.
     */
    public int read(byte[] buffer, int offset, int count) throws IOException;

    /**
     * Reads the next object from this stream.
     *
     * @return the object read.
     *
     * @throws ClassNotFoundException
     *             if the object's class cannot be found.
     * @throws IOException
     *             if this stream is closed or another I/O error occurs.
     */
    public Object readObject() throws ClassNotFoundException, IOException;

    /**
     * Skips {@code toSkip} bytes on this stream. Less than {@code toSkip} byte are
     * skipped if the end of this stream is reached before the operation
     * completes.
     *
     * @param toSkip
     *            the number of bytes to skip.
     * @return the number of bytes actually skipped.
     *
     * @throws IOException
     *             if this stream is closed or another I/O error occurs.
     */
    public long skip(long toSkip) throws IOException;
}
