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);
|
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 a thread was providing data characters
to the connected piped writer, but
the thread is no longer alive, then an
IOException 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. 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.
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();
|