/*
 *  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 writing serialized objects.
 *
 * @see ObjectOutputStream
 * @see ObjectInput
 */
public interface ObjectOutput extends DataOutput, AutoCloseable {
    /**
     * Closes the target stream. Implementations of this method should free any
     * resources used by the stream.
     *
     * @throws IOException
     *             if an error occurs while closing the target stream.
     */
    public void close() throws IOException;

    /**
     * Flushes the target stream. Implementations of this method should ensure
     * that any pending writes are written out to the target stream.
     *
     * @throws IOException
     *             if an error occurs while flushing the target stream.
     */
    public void flush() throws IOException;

    /**
     * Writes the entire contents of the byte array {@code buffer} to the output
     * stream. Blocks until all bytes are written.
     *
     * @param buffer
     *            the buffer to write.
     * @throws IOException
     *             if an error occurs while writing to the target stream.
     */
    public void write(byte[] buffer) throws IOException;

    /**
     * Writes {@code count} bytes from the byte array {@code buffer} starting at
     * position {@code offset} to the target stream. Blocks until all bytes are
     * written.
     *
     * @param buffer
     *            the buffer to write.
     * @param offset
     *            the index of the first byte in {@code buffer} to write.
     * @param count
     *            the number of bytes from {@code buffer} to write to the target
     *            stream.
     * @throws IOException
     *             if an error occurs while writing to the target stream.
     */
    public void write(byte[] buffer, int offset, int count) throws IOException;

    /**
     * Writes a single byte to the target stream. Only the least significant
     * byte of the integer {@code value} is written to the stream. Blocks until
     * the byte is actually written.
     *
     * @param value
     *            the byte to write.
     * @throws IOException
     *             if an error occurs while writing to the target stream.
     */
    public void write(int value) throws IOException;

    /**
     * Writes the specified object {@code obj} to the target stream.
     *
     * @param obj
     *            the object to write.
     * @throws IOException
     *             if an error occurs while writing to the target stream.
     */
    public void writeObject(Object obj) throws IOException;
}
