Class NonBlockingInputStreamImpl

All Implemented Interfaces:
Closeable, AutoCloseable

public class NonBlockingInputStreamImpl extends NonBlockingInputStream
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.
  • Constructor Details

    • NonBlockingInputStreamImpl

      public NonBlockingInputStreamImpl(String name, InputStream in)
      Creates a NonBlockingReader out of a normal blocking reader. 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:
      name - The stream name
      in - The reader to wrap
  • Method Details

    • shutdown

      public 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.
      Overrides:
      shutdown in class NonBlockingInputStream
    • close

      public void close() throws IOException
      Specified by:
      close in interface AutoCloseable
      Specified by:
      close in interface Closeable
      Overrides:
      close in class InputStream
      Throws:
      IOException
    • read

      public int read(long timeout, boolean isPeek) throws IOException
      Attempts to read a byte from the input stream for a specific period of time.
      Specified by:
      read in class NonBlockingInputStream
      Parameters:
      timeout - The amount of time to wait for the character
      isPeek - trueif the byte read must not be consumed
      Returns:
      The byte read, -1 if EOF is reached, or -2 if the read timed out.
      Throws:
      IOException - if anything wrong happens