FileDocCategorySizeDatePackage
PipedReader.javaAPI DocJava SE 6 API10734Tue Jun 10 00:25:34 BST 2008java.io

PipedReader

public class PipedReader extends Reader
Piped character-input streams.
version
1.19, 06/06/28
author
Mark Reinhold
since
JDK1.1

Fields Summary
boolean
closedByWriter
boolean
closedByReader
boolean
connected
Thread
readSide
Thread
writeSide
private static final int
DEFAULT_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.


                                                           
         
	this(src, DEFAULT_PIPE_SIZE);
    
public PipedReader(PipedWriter src, int pipeSize)
Creates a PipedReader so that it is connected to the piped writer src and uses the specified pipe size for the pipe's buffer. Data written to src will then be available as input from this stream.

param
src the stream to connect to.
param
pipeSize the size of the pipe's buffer.
exception
IOException if an I/O error occurs.
exception
IllegalArgumentException if pipeSize <= 0.
since
1.6

	initPipe(pipeSize);
	connect(src);
    
public PipedReader()
Creates a PipedReader so that it is not yet {@linkplain #connect(java.io.PipedWriter) connected}. It must be {@linkplain java.io.PipedWriter#connect( java.io.PipedReader) connected} to a PipedWriter before being used.

	initPipe(DEFAULT_PIPE_SIZE);
    
public PipedReader(int pipeSize)
Creates a PipedReader so that it is not yet {@link #connect(java.io.PipedWriter) connected} and uses the specified pipe size for the pipe's buffer. It must be {@linkplain java.io.PipedWriter#connect( java.io.PipedReader) connected} to a PipedWriter before being used.

param
pipeSize the size of the pipe's buffer.
exception
IllegalArgumentException if pipeSize <= 0.
since
1.6

	initPipe(pipeSize);
    
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);
    
private voidinitPipe(int pipeSize)

	if (pipeSize <= 0) {
	    throw new IllegalArgumentException("Pipe size <= 0");
	}
	buffer = new char[pipeSize];
    
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.

return
the next character of data, or -1 if the end of the stream is reached.
exception
IOException if the pipe is broken, {@link #connect(java.io.PipedWriter) unconnected}, closed, or 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");
        }

        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 or if len exceeds the pipe's buffer size. This method blocks until at least one character of input is available.

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 the pipe is broken, {@link #connect(java.io.PipedWriter) unconnected}, closed, or 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 the pipe is broken, {@link #connect(java.io.PipedWriter) unconnected}, or closed.

        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();