public class

NonBlockingInputStream

extends InputStream
implements Runnable
java.lang.Object
   ↳ java.io.InputStream
     ↳ jline.internal.NonBlockingInputStream

Class Overview

This class wraps a regular input stream and allows it to appear as if it is non-blocking; that is, reads can be performed against it that timeout if no data is seen for a period of time. This effect is achieved by having a separate thread perform all non-blocking read requests and then waiting on the thread to complete.

VERY IMPORTANT NOTES

  • This class is not thread safe. It expects at most one reader.
  • The shutdown() method must be called in order to shut down the thread that handles blocking I/O.

Summary

Public Constructors
NonBlockingInputStream(InputStream in, boolean isNonBlockingEnabled)
Creates a NonBlockingInputStream out of a normal blocking stream.
Public Methods
void close()
boolean isNonBlockingEnabled()
Non-blocking is considered enabled if the feature is enabled and the I/O thread has not been shut down.
int peek(long timeout)
Peeks to see if there is a byte waiting in the input stream without actually consuming the byte.
int read(long timeout)
Attempts to read a character from the input stream for a specific period of time.
int read()
int read(byte[] b, int off, int len)
This version of read() is very specific to jline's purposes, it will always always return a single byte at a time, rather than filling the entire buffer.
void run()
synchronized void shutdown()
Shuts down the thread that is handling blocking I/O.
[Expand]
Inherited Methods
From class java.io.InputStream
From class java.lang.Object
From interface java.io.Closeable
From interface java.lang.AutoCloseable
From interface java.lang.Runnable

Public Constructors

public NonBlockingInputStream (InputStream in, boolean isNonBlockingEnabled)

Creates a NonBlockingInputStream out of a normal blocking stream. Note that this call also spawn a separate thread to perform the blocking I/O on behalf of the thread that is using this class. The shutdown() method must be called in order to shut this thread down.

Parameters
in The input stream to wrap
isNonBlockingEnabled If true, then the non-blocking methods read(long) and peek(long) will be available and, more importantly, the thread will be started to provide support for the feature. If false, then this class acts as a clean-passthru for the underlying I/O stream and provides very little overhead.

Public Methods

public void close ()

Throws
IOException

public boolean isNonBlockingEnabled ()

Non-blocking is considered enabled if the feature is enabled and the I/O thread has not been shut down.

Returns
  • true if non-blocking mode is enabled.

public int peek (long timeout)

Peeks to see if there is a byte waiting in the input stream without actually consuming the byte.

Parameters
timeout The amount of time to wait, 0 == forever
Returns
  • -1 on eof, -2 if the timeout expired with no available input or the character that was read (without consuming it).
Throws
IOException

public int read (long timeout)

Attempts to read a character from the input stream for a specific period of time.

Parameters
timeout The amount of time to wait for the character
Returns
  • The character read, -1 if EOF is reached, or -2 if the read timed out.
Throws
IOException

public int read ()

Throws
IOException

public int read (byte[] b, int off, int len)

This version of read() is very specific to jline's purposes, it will always always return a single byte at a time, rather than filling the entire buffer.

Throws
IOException

public void run ()

public synchronized void shutdown ()

Shuts down the thread that is handling blocking I/O. Note that if the thread is currently blocked waiting for I/O it will not actually shut down until the I/O is received. Shutting down the I/O thread does not prevent this class from being used, but causes the non-blocking methods to fail if called and causes isNonBlockingEnabled() to return false.