Class NonBlockingInputStream
- java.lang.Object
-
- java.io.InputStream
-
- org.jline.utils.NonBlockingInputStream
-
- All Implemented Interfaces:
java.io.Closeable,java.lang.AutoCloseable
- Direct Known Subclasses:
NonBlockingInputStreamImpl,NonBlockingPumpInputStream
public abstract class NonBlockingInputStream extends java.io.InputStreamAn input stream that supports non-blocking read operations with timeouts.The NonBlockingInputStream class extends InputStream to provide non-blocking read operations. Unlike standard input streams, which block indefinitely until data is available or the end of the stream is reached, non-blocking input streams can be configured to return immediately or after a specified timeout if no data is available.
This class defines two special return values:
EOF(-1) - Indicates that the end of the stream has been reachedREAD_EXPIRED(-2) - Indicates that the read operation timed out
This abstract class provides the framework for non-blocking input operations, with concrete implementations handling the details of how the non-blocking behavior is achieved (e.g., through NIO, separate threads, or native methods).
Non-blocking input streams are particularly useful for terminal applications that need to perform other tasks while waiting for user input, or that need to implement features like input timeouts or polling.
-
-
Field Summary
Fields Modifier and Type Field Description protected booleanclosedFlag indicating whether this input stream has been closed.static intEOFstatic intREAD_EXPIRED
-
Constructor Summary
Constructors Constructor Description NonBlockingInputStream()Default constructor.
-
Method Summary
All Methods Instance Methods Abstract Methods Concrete Methods Modifier and Type Method Description protected voidcheckClosed()Checks if this input stream has been closed.voidclose()Closes this input stream and marks it as closed.intpeek(long timeout)Peeks to see if there is a byte waiting in the input stream without actually consuming the byte.intread()Reads the next byte of data from the input stream.intread(byte[] b, int off, int len)intread(long timeout)Attempts to read a character from the input stream for a specific period of time.abstract intread(long timeout, boolean isPeek)intreadBuffered(byte[] b)intreadBuffered(byte[] b, int off, int len, long timeout)intreadBuffered(byte[] b, long timeout)voidshutdown()Shuts down the thread that is handling blocking I/O if any.
-
-
-
Field Detail
-
EOF
public static final int EOF
- See Also:
- Constant Field Values
-
READ_EXPIRED
public static final int READ_EXPIRED
- See Also:
- Constant Field Values
-
closed
protected volatile boolean closed
Flag indicating whether this input stream has been closed. Marked as volatile to ensure visibility across threads.
-
-
Method Detail
-
checkClosed
protected void checkClosed() throws java.io.IOExceptionChecks if this input stream has been closed.In JLine 3.x, warn mode is enabled by default: when a closed input stream is accessed, it logs a WARNING instead of throwing an exception. This allows existing code to continue working while alerting developers to the issue.
The behavior can be controlled via the system property
PROP_CLOSE_MODE:"strict"- ThrowClosedException"warn"- Log a warning but continue (default in JLine 3.x)"lenient"- Silently allow access (no warning, no exception)
- Throws:
ClosedException- if this input stream has been closed and strict mode is enabledjava.io.IOException
-
read
public int read() throws java.io.IOExceptionReads the next byte of data from the input stream. The value byte is returned as anintin the range0to255. If no byte is available because the end of the stream has been reached, the value-1is returned. This method blocks until input data is available, the end of the stream is detected, or an exception is thrown.- Specified by:
readin classjava.io.InputStream- Returns:
- the next byte of data, or
-1if the end of the stream is reached. - Throws:
java.io.IOException- if an I/O error occurs.
-
peek
public int peek(long timeout) throws java.io.IOExceptionPeeks 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:
java.io.IOException- if an I/O error occurs.
-
read
public int read(long timeout) throws java.io.IOExceptionAttempts 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:
java.io.IOException- if an I/O error occurs.
-
read
public int read(byte[] b, int off, int len) throws java.io.IOException- Overrides:
readin classjava.io.InputStream- Throws:
java.io.IOException
-
readBuffered
public int readBuffered(byte[] b) throws java.io.IOException- Throws:
java.io.IOException
-
readBuffered
public int readBuffered(byte[] b, long timeout) throws java.io.IOException- Throws:
java.io.IOException
-
readBuffered
public int readBuffered(byte[] b, int off, int len, long timeout) throws java.io.IOException- Throws:
java.io.IOException
-
shutdown
public void shutdown()
Shuts down the thread that is handling blocking I/O if any. Note that if the thread is currently blocked waiting for I/O it may not actually shut down until the I/O is received.
-
read
public abstract int read(long timeout, boolean isPeek) throws java.io.IOException- Throws:
java.io.IOException
-
close
public void close() throws java.io.IOExceptionCloses this input stream and marks it as closed.Subsequent read operations behavior depends on the
PROP_CLOSE_MODEsetting:"strict"- ThrowClosedException"warn"- Log a warning but continue (default in JLine 3.x)"lenient"- Silently allow access
- Specified by:
closein interfacejava.lang.AutoCloseable- Specified by:
closein interfacejava.io.Closeable- Overrides:
closein classjava.io.InputStream- Throws:
java.io.IOException- if an I/O error occurs
-
-