/* OutputStream.java -- Base class for byte output streams
   Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc.

This file is part of GNU Classpath.

GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
 
GNU Classpath is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
General Public License for more details.

You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING.  If not, write to the
Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA.

Linking this library statically or dynamically with other modules is
making a combined work based on this library.  Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.

As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module.  An independent module is a module which is not derived from
or based on this library.  If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so.  If you do not wish to do so, delete this
exception statement from your version. */


package java.io;

/**
  * This abstract class forms the base of the hierarchy of classes that 
  * write output as a stream of bytes.  It provides a common set of methods
  * for writing bytes to stream.  Subclasses implement and/or extend these
  * methods to write bytes in a particular manner or to a particular 
  * destination such as a file on disk or network connection.
  *
  * @author Aaron M. Renn (arenn@urbanophile.com)
  * @author Tom Tromey <tromey@cygnus.com>
  */
public abstract class OutputStream
{
  /**
   * This is the default no-argument constructor for this class.  This method
   * does nothing in this class.
   */
  public OutputStream ()
  {
  }

  /**
   * This method writes a single byte to the output stream.  The byte written
   * is the low eight bits of the <code>int</code> passed and a argument.
   * <p>
   * Subclasses must provide an implementation of this abstract method
   *
   * @param b The byte to be written to the output stream, passed as
   *          the low eight bits of an <code>int</code> 
   *
   * @exception IOException If an error occurs
   */
  public abstract void write (int b) throws IOException;

  /**
   * This method all the writes bytes from the passed array to the
   * output stream.  This method is equivalent to <code>write(b, 0,
   * buf.length)</code> which is exactly how it is implemented in this
   * class.
   *
   * @param b The array of bytes to write
   *
   * @exception IOException If an error occurs
   */
  public void write (byte[] b) throws IOException, NullPointerException
  {
    write (b, 0, b.length);
  }

  /**
   * This method writes <code>len</code> bytes from the specified array
   * <code>b</code> starting at index <code>off</code> into the array.
   * <p>
   * This method in this class calls the single byte <code>write()</code>
   * method in a loop until all bytes have been written.  Subclasses should
   * override this method if possible in order to provide a more efficent
   * implementation.
   *
   * @param b The array of bytes to write from
   * @param off The index into the array to start writing from
   * @param len The number of bytes to write
   * 
   * @exception IOException If an error occurs
   */
  public void write (byte[] b, int off, int len)
    throws IOException, NullPointerException, IndexOutOfBoundsException
  {
    if (off < 0 || len < 0 || off + len > b.length)
      throw new ArrayIndexOutOfBoundsException ();
    for (int i = 0; i < len; ++i)
      write (b[off + i]);
  }

  /**
   * This method forces any data that may have been buffered to be written
   * to the underlying output device.  Please note that the host environment
   * might perform its own buffering unbeknowst to Java.  In that case, a
   * write made (for example, to a disk drive) might be cached in OS
   * buffers instead of actually being written to disk.
   * <p>
   * This method in this class does nothing.
   *
   * @exception IOException If an error occurs
   */
  public void flush () throws IOException
  {
  }

  /**
   * This method closes the stream.  Any internal or native resources
   * associated with this stream are freed.  Any subsequent attempt to
   * access the stream might throw an exception.
   * <p>
   * This method in this class does nothing.
   *
   * @exception IOException If an error occurs
   */
  public void close () throws IOException
  {
  }
}
