aboutsummaryrefslogtreecommitdiff
path: root/libjava/java/io/PipedOutputStream.java
diff options
context:
space:
mode:
Diffstat (limited to 'libjava/java/io/PipedOutputStream.java')
-rw-r--r--libjava/java/io/PipedOutputStream.java292
1 files changed, 128 insertions, 164 deletions
diff --git a/libjava/java/io/PipedOutputStream.java b/libjava/java/io/PipedOutputStream.java
index b12d1e5..96b8e9e 100644
--- a/libjava/java/io/PipedOutputStream.java
+++ b/libjava/java/io/PipedOutputStream.java
@@ -1,5 +1,5 @@
/* PipedOutputStream.java -- Write portion of piped streams.
- Copyright (C) 1998, 2000 Free Software Foundation, Inc.
+ Copyright (C) 1998, 2000, 2001 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -27,6 +27,10 @@ executable file might be covered by the GNU General Public License. */
package java.io;
+// NOTE: This implementation is very similar to that of PipedWriter. If you
+// fix a bug in here, chances are you should make a similar change to the
+// PipedWriter code.
+
/**
* This class writes its bytes to a <code>PipedInputStream</code> to
* which it is connected.
@@ -36,171 +40,131 @@ package java.io;
* they are in the same thread, read and write operations could deadlock
* the thread.
*
- * @version 0.0
- *
* @author Aaron M. Renn (arenn@urbanophile.com)
*/
public class PipedOutputStream extends OutputStream
{
-
-/*************************************************************************/
-
-/*
- * Instance Variables
- */
-
-/**
- * This is the <code>PipedInputStream</code> to which this object
- * is connected.
- */
-private PipedInputStream snk;
-
-/**
- * This flag indicates whether or not this stream has ever been
- * connected to an input stream
- */
-private boolean ever_connected;
-
-/**
- * This flag indicates whether the <code>close</code> method has ever
- * been called for this stream.
- */
-private boolean closed;
-
-/*************************************************************************/
-
-/**
- * This method initializes a new <code>PipedOutputStream</code> instance.
- * This constructor creates an unconnected object. It must be connected
- * to a <code>PipedInputStream</code> object using the <code>connect</code>
- * method prior to writing any data or an exception will be thrown.
- */
-public
-PipedOutputStream()
-{
- ; // Do Nothing
-}
-
-/*************************************************************************/
-
-/**
- * This method initializes a new <code>PipedOutputStream</code> instance
- * to write to the specified <code>PipedInputStream</code>. This stream
- * is then ready for writing.
- *
- * @param snk The <code>PipedInputStream</code> to connect this stream to.
- *
- * @exception IOException If an error occurs
- */
-public
-PipedOutputStream(PipedInputStream snk) throws IOException
-{
- connect(snk);
-}
-
-/*************************************************************************/
-
-/*
- * Instance Methods
- */
-
-/**
- * This method connects this object to the specified
- * <code>PipedInputStream</code> object. This stream will then be ready
- * for writing. If this stream is already connected or has been
- * previously closed, then an exception is thrown.
- *
- * @param snk The <code>PipedInputStream</code> to connect this stream to
- *
- * @exception IOException If an error occurs
- */
-public synchronized void
-connect(PipedInputStream snk) throws IOException
-{
- if (snk == this.snk)
- return;
-
- if (ever_connected)
- throw new IOException("Already connected");
-
- if (closed)
- throw new IOException("Stream is closed and cannot be reopened");
-
- this.snk = snk;
- ever_connected = true;
- snk.src = this;
-
- snk.connect(this);
-}
-
-/*************************************************************************/
-
-/**
- * This method closes this stream so that no more data can be written
- * to it. Any further attempts to write to this stream may throw an
- * exception
- *
- * @exception IOException If an error occurs
- */
-public synchronized void
-close() throws IOException
-{
- closed = true;
- snk.close();
- notifyAll();
-}
-
-/*************************************************************************/
-
-/**
- * This method writes a single byte of date to the stream. Note that
- * this method will block if the <code>PipedInputStream</code> to which
- * this object is connected has a full buffer.
- *
- * @param b The byte of data to be written, passed as an <code>int</code>.
- *
- * @exception IOException If an error occurs
- */
-public synchronized void
-write(int b) throws IOException
-{
- snk.receive (b);
+ /** Target PipedInputStream to which this is connected. Null only if this
+ * OutputStream hasn't been connected yet. */
+ PipedInputStream sink;
+
+ /** Set to true if close() has been called on this OutputStream. */
+ boolean closed;
+
+ /**
+ * Create an unconnected PipedOutputStream. It must be connected
+ * to a <code>PipedInputStream</code> using the <code>connect</code>
+ * method prior to writing any data or an exception will be thrown.
+ */
+ public PipedOutputStream()
+ {
+ }
+
+ /**
+ * Create a new <code>PipedOutputStream</code> instance
+ * to write to the specified <code>PipedInputStream</code>. This stream
+ * is then ready for writing.
+ *
+ * @param sink The <code>PipedInputStream</code> to connect this stream to.
+ *
+ * @exception IOException If <code>sink</code> has already been connected
+ * to a different PipedOutputStream.
+ */
+ public PipedOutputStream(PipedInputStream sink) throws IOException
+ {
+ sink.connect(this);
+ }
+
+ /**
+ * Connects this object to the specified <code>PipedInputStream</code>
+ * object. This stream will then be ready for writing.
+ *
+ * @param sink The <code>PipedInputStream</code> to connect this stream to
+ *
+ * @exception IOException If the stream has not been connected or has
+ * been closed.
+ */
+ public void connect(PipedInputStream sink) throws IOException
+ {
+ if (sink != null)
+ throw new IOException ("Already connected");
+ sink.connect(this);
+ }
+
+ /**
+ * Write a single byte of date to the stream. Note that this method will
+ * block if the <code>PipedInputStream</code> to which this object is
+ * connected has a full buffer.
+ *
+ * @param b The byte of data to be written, passed as an <code>int</code>.
+ *
+ * @exception IOException If the stream has not been connected or has
+ * been closed.
+ */
+ public void write(int b) throws IOException
+ {
+ if (sink == null)
+ throw new IOException ("Not connected");
+ if (closed)
+ throw new IOException ("Pipe closed");
+
+ sink.receive (b);
+ }
+
+ /**
+ * This method writes <code>len</code> bytes of data from the byte array
+ * <code>buf</code> starting at index <code>offset</code> in the array
+ * to the stream. Note that this method will block if the
+ * <code>PipedInputStream</code> to which this object is connected has
+ * a buffer that cannot hold all of the bytes to be written.
+ *
+ * @param buf The array containing bytes to write to the stream.
+ * @param offset The index into the array to start writing bytes from.
+ * @param len The number of bytes to write.
+ *
+ * @exception IOException If the stream has not been connected or has
+ * been closed.
+ */
+ public void write(byte[] b, int off, int len) throws IOException
+ {
+ if (sink == null)
+ throw new IOException ("Not connected");
+ if (closed)
+ throw new IOException ("Pipe closed");
+
+ sink.receive (b, off, len);
+ }
+
+ /**
+ * This method does nothing.
+ *
+ * @exception IOException If the stream is closed.
+ * @specnote You'd think that this method would block until the sink
+ * had read all available data. Thats not the case - this method
+ * appears to be a no-op?
+ */
+ public void flush()
+ {
+ }
+
+ /**
+ * This method closes this stream so that no more data can be written
+ * to it. Any further attempts to write to this stream may throw an
+ * exception
+ *
+ * @exception IOException If an error occurs
+ */
+ public void close()
+ {
+ // A close call on an unconnected PipedOutputStream has no effect.
+ if (sink != null)
+ {
+ closed = true;
+ // Notify any waiting readers that the stream is now closed.
+ synchronized (sink)
+ {
+ sink.notifyAll();
+ }
+ }
+ }
}
-
-/*************************************************************************/
-
-/**
- * This method writes <code>len</code> bytes of data from the byte array
- * <code>buf</code> starting at index <code>offset</code> in the array
- * to the stream. Note that this method will block if the
- * <code>PipedInputStream</code> to which this object is connected has
- * a buffer that cannot hold all of the bytes to be written.
- *
- * @param buf The array containing bytes to write to thes stream.
- * @param offset The index into the array to start writing bytes from.
- * @param len The number of bytes to write.
- *
- * @exception IOException If an error occurs
- */
-public void
-write(byte[] buf, int offset, int len) throws IOException
-{
- snk.receive (buf, 0, len);
-}
-
-/*************************************************************************/
-
-/**
- * This method flushes any unwritten bytes to the output and notifies
- * any waiting readers that the pipe is ready to be read.
- *
- * @exception IOException If an error occurs.
- */
-public void
-flush() throws IOException
-{
- return;
-}
-
-} // class PipedOutputStream
-