diff options
Diffstat (limited to 'libjava/java/io/PipedOutputStream.java')
-rw-r--r-- | libjava/java/io/PipedOutputStream.java | 292 |
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 - |