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.
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.
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.
initPipe(pipeSize);
|
Methods Summary |
---|
public void | close()Closes this piped stream and releases any system resources
associated with the stream.
in = -1;
closedByReader = true;
|
public void | connect(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.
src.connect(this);
|
private void | initPipe(int pipeSize)
if (pipeSize <= 0) {
throw new IllegalArgumentException("Pipe size <= 0");
}
buffer = new char[pipeSize];
|
public synchronized int | read()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 (!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 int | read(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.
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 boolean | ready()Tell whether this stream is ready to be read. A piped character
stream is ready if the circular buffer is not empty.
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 void | receive(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 void | receive(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 void | receivedLast()Notifies all waiting threads that the last character of data has been
received.
closedByWriter = true;
notifyAll();
|