FileDocCategorySizeDatePackage
PipedReader.javaAPI DocJava SE 5 API9142Fri Aug 26 14:57:00 BST 2005java.io

PipedReader

public class PipedReader extends Reader
Piped character-input streams.
version
1.15, 03/12/19
author
Mark Reinhold
since
JDK1.1

Fields Summary
boolean
closedByWriter
boolean
closedByReader
boolean
connected
Thread
readSide
Thread
writeSide
static final int
PIPE_SIZE
The size of the pipe's circular input buffer.
char[]
buffer
The circular buffer into which incoming data is placed.
int
in
The index of the position in the circular buffer at which the next character of data will be stored when received from the connected piped writer. in<0 implies the buffer is empty, in==out implies the buffer is full
int
out
The index of the position in the circular buffer at which the next character of data will be read by this piped reader.
Constructors Summary
public PipedReader(PipedWriter src)
Creates a PipedReader so that it is connected to the piped writer src. Data written to src will then be available as input from this stream.

param
src the stream to connect to.
exception
IOException if an I/O error occurs.


                                                            
         
	connect(src);
    
public PipedReader()
Creates a PipedReader so that it is not yet connected. It must be connected to a PipedWriter before being used.

see
java.io.PipedReader#connect(java.io.PipedWriter)
see
java.io.PipedWriter#connect(java.io.PipedReader)

    
Methods Summary
public voidclose()
Closes this piped stream and releases any system resources associated with the stream.

exception
IOException if an I/O error occurs.

	in = -1;
	closedByReader = true;
    
public voidconnect(java.io.PipedWriter src)
Causes this piped reader to be connected to the piped writer src. If this object is already connected to some other piped writer, an IOException is thrown.

If src is an unconnected piped writer and snk is an unconnected piped reader, they may be connected by either the call:

snk.connect(src) 

or the call:

src.connect(snk) 

The two calls have the same effect.

param
src The piped writer to connect to.
exception
IOException if an I/O error occurs.

	src.connect(this);
    
public synchronized intread()
Reads the next character of data from this piped stream. If no character is available because the end of the stream has been reached, the value -1 is returned. This method blocks until input data is available, the end of the stream is detected, or an exception is thrown. If a thread was providing data characters to the connected piped writer, but the thread is no longer alive, then an IOException is thrown.

return
the next character of data, or -1 if the end of the stream is reached.
exception
IOException if the pipe is broken.

        if (!connected) {
            throw new IOException("Pipe not connected");
        } else if (closedByReader) {
	    throw new IOException("Pipe closed");
	} else if (writeSide != null && !writeSide.isAlive()
                   && !closedByWriter && (in < 0)) {
            throw new IOException("Write end dead");
        }

        readSide = Thread.currentThread();
	int trials = 2;
	while (in < 0) {
	    if (closedByWriter) { 
		/* closed by writer, return EOF */
		return -1;
	    }
	    if ((writeSide != null) && (!writeSide.isAlive()) && (--trials < 0)) {
		throw new IOException("Pipe broken");
	    }
            /* might be a writer waiting */
	    notifyAll();
	    try {
	        wait(1000);
	    } catch (InterruptedException ex) {
		throw new java.io.InterruptedIOException();
	    }
 	}
	int ret = buffer[out++];
	if (out >= buffer.length) {
	    out = 0;
	}
	if (in == out) {
            /* now empty */
	    in = -1;		
	}
	return ret;
    
public synchronized intread(char[] cbuf, int off, int len)
Reads up to len characters of data from this piped stream into an array of characters. Less than len characters will be read if the end of the data stream is reached. This method blocks until at least one character of input is available. If a thread was providing data characters to the connected piped output, but the thread is no longer alive, then an IOException is thrown.

param
cbuf the buffer into which the data is read.
param
off the start offset of the data.
param
len the maximum number of characters read.
return
the total number of characters read into the buffer, or -1 if there is no more data because the end of the stream has been reached.
exception
IOException if an I/O error occurs.

        if (!connected) {
            throw new IOException("Pipe not connected");
        } else if (closedByReader) {
	    throw new IOException("Pipe closed");
	} else if (writeSide != null && !writeSide.isAlive()
                   && !closedByWriter && (in < 0)) {
            throw new IOException("Write end dead");
        }

        if ((off < 0) || (off > cbuf.length) || (len < 0) ||
            ((off + len) > cbuf.length) || ((off + len) < 0)) {
	    throw new IndexOutOfBoundsException();
	} else if (len == 0) {
	    return 0;
	}

        /* possibly wait on the first character */
	int c = read();		
	if (c < 0) {
	    return -1;
	}
	cbuf[off] =  (char)c;
	int rlen = 1;
	while ((in >= 0) && (--len > 0)) {
	    cbuf[off + rlen] = buffer[out++];
	    rlen++;
	    if (out >= buffer.length) {
		out = 0;
	    }
	    if (in == out) {
                /* now empty */
		in = -1;	
	    }
	}
	return rlen;
    
public synchronized booleanready()
Tell whether this stream is ready to be read. A piped character stream is ready if the circular buffer is not empty.

exception
IOException If an I/O error occurs

        if (!connected) {
            throw new IOException("Pipe not connected");
        } else if (closedByReader) {
	    throw new IOException("Pipe closed");
	} else if (writeSide != null && !writeSide.isAlive()
                   && !closedByWriter && (in < 0)) {
            throw new IOException("Write end dead");
        }
        if (in < 0) {
            return false;
        } else {
            return true;
        }
    
synchronized voidreceive(int c)
Receives a char of data. This method will block if no input is available.

        if (!connected) {
            throw new IOException("Pipe not connected");
        } else if (closedByWriter || closedByReader) {
	    throw new IOException("Pipe closed");
	} else if (readSide != null && !readSide.isAlive()) {
            throw new IOException("Read end dead");
        }

	writeSide = Thread.currentThread();
	while (in == out) {
	    if ((readSide != null) && !readSide.isAlive()) {
		throw new IOException("Pipe broken");
	    }
	    /* full: kick any waiting readers */
	    notifyAll();	
	    try {
	        wait(1000);
	    } catch (InterruptedException ex) {
		throw new java.io.InterruptedIOException();
	    }
	}
	if (in < 0) {
	    in = 0;
	    out = 0;
	}
	buffer[in++] = (char) c;
	if (in >= buffer.length) {
	    in = 0;
	}
    
synchronized voidreceive(char[] c, int off, int len)
Receives data into an array of characters. This method will block until some input is available.

	while (--len >= 0) {
	    receive(c[off++]);
	}
    
synchronized voidreceivedLast()
Notifies all waiting threads that the last character of data has been received.

	closedByWriter = true;
	notifyAll();