diff options
Diffstat (limited to 'libjava/java/io/PipedWriter.java')
-rw-r--r-- | libjava/java/io/PipedWriter.java | 304 |
1 files changed, 128 insertions, 176 deletions
diff --git a/libjava/java/io/PipedWriter.java b/libjava/java/io/PipedWriter.java index cc36acd..a0a51d1 100644 --- a/libjava/java/io/PipedWriter.java +++ b/libjava/java/io/PipedWriter.java @@ -1,5 +1,5 @@ -/* PipedWriter.java -- Write portion of piped streams. - Copyright (C) 1998 Free Software Foundation, Inc. +/* PipedWriter.java -- Write portion of piped character streams. + 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 PipedOutputStream. +// If you fix a bug in here, chances are you should make a similar change to +// the PipedOutputStream code. + /** * This class writes its chars to a <code>PipedReader</code> to * which it is connected. @@ -36,182 +40,130 @@ 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 PipedWriter extends Writer { - -/*************************************************************************/ - -/* - * Instance Variables - */ - -/** - * This is the <code>PipedReader</code> to which this object - * is connected. - */ -private PipedReader 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>PipedWriter</code> instance. - * This constructor creates an unconnected object. It must be connected - * to a <code>PipedReader</code> object using the <code>connect</code> - * method prior to writing any data or an exception will be thrown. - */ -public -PipedWriter() -{ - ; // Do Nothing -} - -/*************************************************************************/ - -/** - * This method initializes a new <code>PipedWriter</code> instance - * to write to the specified <code>PipedReader</code>. This stream - * is then ready for writing. - * - * @param snk The <code>PipedReader</code> to connect this stream to. - * - * @exception IOException If an error occurs - */ -public -PipedWriter(PipedReader snk) throws IOException -{ - connect(snk); -} - -/*************************************************************************/ - -/* - * Instance Methods - */ - -/** - * This method connects this object to the specified - * <code>PipedReader</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>PipedReader</code> to connect this stream to - * - * @exception IOException If an error occurs - */ -public void -connect(PipedReader 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"); - - synchronized (lock) { - - this.snk = snk; - ever_connected = true; - snk.src = this; - - snk.connect(this); - - } // synchronized -} - -/*************************************************************************/ - -/** - * 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() throws IOException -{ - synchronized (lock) { - - closed = true; - snk.close(); - notifyAll(); - - } // synchronized + /** Target PipedReader to which this is connected. Null only if this + * Writer hasn't been connected yet. */ + PipedReader sink; + + /** Set to true if close() has been called on this Writer. */ + boolean closed; + + /** Buffer used to implement single-argument write */ + char[] read_buf = new char[1]; + + /** + * Create an unconnected PipedWriter. It must be connected + * to a <code>PipedReader</code> using the <code>connect</code> + * method prior to writing any data or an exception will be thrown. + */ + public PipedWriter() + { + } + + /** + * Create a new <code>PipedWriter</code> instance + * to write to the specified <code>PipedReader</code>. This stream + * is then ready for writing. + * + * @param sink The <code>PipedReader</code> to connect this stream to. + * + * @exception IOException If <code>sink</code> has already been connected + * to a different PipedWriter. + */ + public PipedWriter(PipedReader sink) throws IOException + { + sink.connect(this); + } + + /** + * Connects this object to the specified <code>PipedReader</code> + * object. This stream will then be ready for writing. + * + * @param sink The <code>PipedReader</code> to connect this stream to + * + * @exception IOException If the stream has not been connected or has + * been closed. + */ + public void connect(PipedReader sink) throws IOException + { + if (sink != null) + throw new IOException ("Already connected"); + sink.connect(this); + } + + /** + * Write a single char of date to the stream. Note that this method will + * block if the <code>PipedReader</code> to which this object is + * connected has a full buffer. + * + * @param b The char 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(char b) throws IOException + { + read_buf[0] = b; + sink.receive (read_buf, 0, 1); + } + + /** + * This method writes <code>len</code> chars of data from the char 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>PipedReader</code> to which this object is connected has + * a buffer that cannot hold all of the chars to be written. + * + * @param buf The array containing chars to write to the stream. + * @param offset The index into the array to start writing chars from. + * @param len The number of chars to write. + * + * @exception IOException If the stream has not been connected or has + * been closed. + */ + public void write(char[] 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 PipedWriter has no effect. + if (sink != null) + { + closed = true; + // Notify any waiting readers that the stream is now closed. + synchronized (sink) + { + sink.notifyAll(); + } + } + } } - -/*************************************************************************/ - -/** - * This methods writes a single byte of data to the pipe. This call may - * block if the pipe is full. - * - * @param c The <code>char</code> to write, passed as an <code>int</code>. - * - * @exception IOException If an error occurs. - */ -public void -write(int c) throws IOException -{ - char[] buf = new char[1]; - buf[0] = (char)c; - - write(buf, 0, buf.length); -} - -/*************************************************************************/ - -/** - * This method writes <code>len</code> chars of data from the char 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>PipedReader</code> to which this object is connected has - * a buffer that cannot hold all of the chars to be written. - * - * @param buf The array containing chars to write to thes stream. - * @param offset The index into the array to start writing chars from. - * @param len The number of chars to write. - * - * @exception IOException If an error occurs - */ -public void -write(char[] buf, int offset, int len) throws IOException -{ - snk.write(buf, 0, len); -} - -/*************************************************************************/ - -/** - * This method flushes any unwritten chars to the underlying output - * sink. This method does nothing in this class because this class does - * not buffer any chars. - * - * @exception IOException If an error occurs - */ -public void -flush() throws IOException -{ - ; // Do Nothing -} - -} // class PipedWriter - |