Skip to content

Most visited

Recently visited

navigation
Added in API level 1

PipedInputStream

public class PipedInputStream
extends InputStream

java.lang.Object
   ↳ java.io.InputStream
     ↳ java.io.PipedInputStream


Receives information from a communications pipe. When two threads want to pass data back and forth, one creates a piped output stream and the other one creates a piped input stream.

See also:

Summary

Constants

int PIPE_SIZE

The size of the default pipe in bytes.

Fields

protected byte[] buffer

The circular buffer through which data is passed.

protected int in

The index in buffer where the next byte will be written.

protected int out

The index in buffer where the next byte will be read.

Public constructors

PipedInputStream()

Constructs a new unconnected PipedInputStream.

PipedInputStream(PipedOutputStream out)

Constructs a new PipedInputStream connected to the PipedOutputStream out.

PipedInputStream(int pipeSize)

Constructs a new unconnected PipedInputStream with the given buffer size.

PipedInputStream(PipedOutputStream out, int pipeSize)

Constructs a new PipedInputStream connected to the given PipedOutputStream, with the given buffer size.

Public methods

int available()

Returns an estimated number of bytes that can be read or skipped without blocking for more input.

Unlike most streams, PipedInputStream returns 0 rather than throwing IOException if the stream has been closed.

void close()

Closes this stream.

void connect(PipedOutputStream src)

Connects this PipedInputStream to a PipedOutputStream.

int read()

Reads a single byte from this stream and returns it as an integer in the range from 0 to 255.

int read(byte[] bytes, int byteOffset, int byteCount)

Reads up to byteCount bytes from this stream and stores them in the byte array bytes starting at byteOffset.

Protected methods

void receive(int oneByte)

Receives a byte and stores it in this stream's buffer.

Inherited methods

From class java.io.InputStream
From class java.lang.Object
From interface java.io.Closeable
From interface java.lang.AutoCloseable

Constants

PIPE_SIZE

Added in API level 1
int PIPE_SIZE

The size of the default pipe in bytes.

Constant Value: 1024 (0x00000400)

Fields

buffer

Added in API level 1
byte[] buffer

The circular buffer through which data is passed. Data is read from the range [out, in) and written to the range [in, out). Data in the buffer is either sequential:

     { - - - X X X X X X X - - - - - }
             ^             ^
             |             |
            out           in
...or wrapped around the buffer's end:
     { X X X X - - - - - - - - X X X }
               ^               ^
               |               |
              in              out
When the buffer is empty, in == -1. Reading when the buffer is empty will block until data is available. When the buffer is full, in == out. Writing when the buffer is full will block until free space is available.

in

Added in API level 1
int in

The index in buffer where the next byte will be written.

out

Added in API level 1
int out

The index in buffer where the next byte will be read.

Public constructors

PipedInputStream

Added in API level 1
PipedInputStream ()

Constructs a new unconnected PipedInputStream. The resulting stream must be connected to a PipedOutputStream before data may be read from it.

PipedInputStream

Added in API level 1
PipedInputStream (PipedOutputStream out)

Constructs a new PipedInputStream connected to the PipedOutputStream out. Any data written to the output stream can be read from the this input stream.

Parameters
out PipedOutputStream: the piped output stream to connect to.
Throws
IOException if this stream or out are already connected.

PipedInputStream

Added in API level 9
PipedInputStream (int pipeSize)

Constructs a new unconnected PipedInputStream with the given buffer size. The resulting stream must be connected to a PipedOutputStream before data may be read from it.

Parameters
pipeSize int: the size of the buffer in bytes.
Throws
IllegalArgumentException if pipeSize is less than or equal to zero.

PipedInputStream

Added in API level 9
PipedInputStream (PipedOutputStream out, 
                int pipeSize)

Constructs a new PipedInputStream connected to the given PipedOutputStream, with the given buffer size. Any data written to the output stream can be read from this input stream.

Parameters
out PipedOutputStream: the PipedOutputStream to connect to.
pipeSize int: the size of the buffer in bytes.
Throws
IOException if an I/O error occurs.
IllegalArgumentException if pipeSize is less than or equal to zero.

Public methods

available

Added in API level 1
int available ()

Returns an estimated number of bytes that can be read or skipped without blocking for more input.

Note that this method provides such a weak guarantee that it is not very useful in practice.

Firstly, the guarantee is "without blocking for more input" rather than "without blocking": a read may still block waiting for I/O to complete — the guarantee is merely that it won't have to wait indefinitely for data to be written. The result of this method should not be used as a license to do I/O on a thread that shouldn't be blocked.

Secondly, the result is a conservative estimate and may be significantly smaller than the actual number of bytes available. In particular, an implementation that always returns 0 would be correct. In general, callers should only use this method if they'd be satisfied with treating the result as a boolean yes or no answer to the question "is there definitely data ready?".

Thirdly, the fact that a given number of bytes is "available" does not guarantee that a read or skip will actually read or skip that many bytes: they may read or skip fewer.

It is particularly important to realize that you must not use this method to size a container and assume that you can read the entirety of the stream without needing to resize the container. Such callers should probably write everything they read to a ByteArrayOutputStream and convert that to a byte array. Alternatively, if you're reading from a file, length() returns the current length of the file (though assuming the file's length can't change may be incorrect, reading a file is inherently racy).

The default implementation of this method in InputStream always returns 0. Subclasses should override this method if they are able to indicate the number of bytes available.

Unlike most streams, PipedInputStream returns 0 rather than throwing IOException if the stream has been closed. Unconnected and broken pipes also return 0.

Returns
int the estimated number of bytes available
Throws
IOException if an I/O error occurs

close

Added in API level 1
void close ()

Closes this stream. This implementation releases the buffer used for the pipe and notifies all threads waiting to read or write.

Throws
IOException if an error occurs while closing this stream.

connect

Added in API level 1
void connect (PipedOutputStream src)

Connects this PipedInputStream to a PipedOutputStream. Any data written to the output stream becomes readable in this input stream.

Parameters
src PipedOutputStream: the source output stream.
Throws
IOException if either stream is already connected.

read

Added in API level 1
int read ()

Reads a single byte from this stream and returns it as an integer in the range from 0 to 255. Returns -1 if the end of this stream has been reached. If there is no data in the pipe, this method blocks until data is available, the end of the stream is detected or an exception is thrown.

Separate threads should be used to read from a PipedInputStream and to write to the connected PipedOutputStream. If the same thread is used, a deadlock may occur.

Returns
int the byte read or -1 if the end of the source stream has been reached.
Throws
IOException if this stream is closed or not connected to an output stream, or if the thread writing to the connected output stream is no longer alive.

read

Added in API level 1
int read (byte[] bytes, 
                int byteOffset, 
                int byteCount)

Reads up to byteCount bytes from this stream and stores them in the byte array bytes starting at byteOffset. Blocks until at least one byte has been read, the end of the stream is detected or an exception is thrown.

Separate threads should be used to read from a PipedInputStream and to write to the connected PipedOutputStream. If the same thread is used, a deadlock may occur.

Returns the number of bytes actually read or -1 if the end of the stream has been reached.

Parameters
bytes byte
byteOffset int
byteCount int
Returns
int
Throws
IndexOutOfBoundsException if byteOffset < 0 || byteCount < 0 || byteOffset + byteCount > bytes.length.
InterruptedIOException if the thread reading from this stream is interrupted.
IOException if this stream is closed or not connected to an output stream, or if the thread writing to the connected output stream is no longer alive.
NullPointerException if bytes is null.

Protected methods

receive

Added in API level 1
void receive (int oneByte)

Receives a byte and stores it in this stream's buffer. This method is called by write(int). The least significant byte of the integer oneByte is stored at index in in the buffer.

This method blocks as long as buffer is full.

Parameters
oneByte int: the byte to store in this pipe.
Throws
InterruptedIOException if the buffer is full and the thread that has called this method is interrupted.
IOException if this stream is closed or the thread that has last read from this stream is no longer alive.
This site uses cookies to store your preferences for site-specific language and display options.

Hooray!

This class requires API level or higher

This doc is hidden because your selected API level for the documentation is . You can change the documentation API level with the selector above the left navigation.

For more information about specifying the API level your app requires, read Supporting Different Platform Versions.