Class ConcatInputStream

java.lang.Object
java.io.InputStream
com.Ostermiller.util.ConcatInputStream
All Implemented Interfaces:
Closeable, AutoCloseable

public class ConcatInputStream extends InputStream
An input stream which reads sequentially from multiple sources. More information about this class is available from ostermiller.org.
Since:
ostermillerutils 1.04.00
Author:
Stephen Ostermiller https://ostermiller.org/contact.pl?regarding=Java+Utilities
  • Constructor Summary

    Constructors
    Constructor
    Description
    Create a new input stream that can dynamically accept new sources.
    Create a new InputStream with one source.
    Create a new InputStream with an arbitrary number of sources.
    Create a new InputStream with two sources.
  • Method Summary

    Modifier and Type
    Method
    Description
    void
    Add the given inputStream to the queue of inputStreams from which to concatenate data.
    void
    Add the given inputStream to the queue of inputStreams from which to concatenate data.
    int
    Returns the number of bytes that can be read (or skipped over) from this input stream without blocking by the next caller of a method for this input stream.
    void
    Closes this input stream and releases any system resources associated with the stream.
    void
    Causes the addInputStream method to throw IllegalStateException and read() methods to return -1 (end of stream) when there is no more available data.
    void
    mark(int readlimit)
    Mark not supported
    boolean
    Does not support mark.
    int
    Reads the next byte of data from the underlying streams.
    int
    read(byte[] b)
    Reads some number of bytes from the underlying streams and stores them into the buffer array b.
    int
    read(byte[] b, int off, int len)
    Reads up to length bytes of data from the underlying streams into an array of bytes.
    void
    Reset not supported.
    long
    skip(long n)
    Skips over and discards n bytes of data from this input stream.

    Methods inherited from class java.lang.Object

    equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • Constructor Details

    • ConcatInputStream

      public ConcatInputStream()
      Create a new input stream that can dynamically accept new sources.

      New sources should be added using the addInputStream() method. When all sources have been added the lastInputStreamAdded() should be called so that read methods can return -1 (end of stream).

      Adding new sources may by interleaved with read calls.

      Since:
      ostermillerutils 1.04.01
    • ConcatInputStream

      public ConcatInputStream(InputStream in)
      Create a new InputStream with one source.
      Parameters:
      in - InputStream to use as a source.
      Throws:
      NullPointerException - if in is null
      Since:
      ostermillerutils 1.04.00
    • ConcatInputStream

      public ConcatInputStream(InputStream in1, InputStream in2)
      Create a new InputStream with two sources.
      Parameters:
      in1 - first InputStream to use as a source.
      in2 - second InputStream to use as a source.
      Throws:
      NullPointerException - if either source is null.
      Since:
      ostermillerutils 1.04.00
    • ConcatInputStream

      public ConcatInputStream(InputStream[] in)
      Create a new InputStream with an arbitrary number of sources.
      Parameters:
      in - InputStreams to use as a sources.
      Throws:
      NullPointerException - if the input array on any element is null.
      Since:
      ostermillerutils 1.04.00
  • Method Details

    • lastInputStreamAdded

      public void lastInputStreamAdded()
      Causes the addInputStream method to throw IllegalStateException and read() methods to return -1 (end of stream) when there is no more available data.

      Calling this method when this class is no longer accepting more inputStreams has no effect.

      Since:
      ostermillerutils 1.04.01
    • addInputStream

      public void addInputStream(InputStream in)
      Add the given inputStream to the queue of inputStreams from which to concatenate data.
      Parameters:
      in - InputStream to add to the concatenation.
      Throws:
      IllegalStateException - if more inputStreams can't be added because lastInputStreamAdded() has been called, close() has been called, or a constructor with inputStream parameters was used.
      Since:
      ostermillerutils 1.04.01
    • addInputStreams

      public void addInputStreams(InputStream[] in)
      Add the given inputStream to the queue of inputStreams from which to concatenate data.
      Parameters:
      in - InputStream to add to the concatenation.
      Throws:
      IllegalStateException - if more inputStreams can't be added because lastInputStreamAdded() has been called, close() has been called, or a constructor with inputStream parameters was used.
      NullPointerException - the array of inputStreams, or any of the contents is null.
      Since:
      ostermillerutils 1.04.01
    • read

      public int read() throws IOException
      Reads the next byte of data from the underlying streams. The value byte is returned as an int in the range 0 to 255. If no byte 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 this class in not done accepting input streams and the end of the last known stream is reached, this method will block forever unless another thread adds an input stream or interrupts.

      Specified by:
      read in class InputStream
      Returns:
      the next byte of data, or -1 if the end of the stream is reached.
      Throws:
      IOException - if an I/O error occurs.
    • read

      public int read(byte[] b) throws IOException
      Reads some number of bytes from the underlying streams and stores them into the buffer array b. The number of bytes actually read is returned as an integer. This method blocks until input data is available, end of file is detected, or an exception is thrown.

      If the length of b is zero, then no bytes are read and 0 is returned; otherwise, there is an attempt to read at least one byte.

      The read(b) method for class InputStream has the same effect as:
      read(b, 0, b.length)

      If this class in not done accepting input streams and the end of the last known stream is reached, this method will block forever unless another thread adds an input stream or interrupts.

      Overrides:
      read in class InputStream
      Parameters:
      b - - Destination buffer
      Returns:
      The number of bytes read, or -1 if the end of the stream has been reached
      Throws:
      IOException - - If an I/O error occurs
      NullPointerException - - If b is null.
      Since:
      ostermillerutils 1.04.00
    • read

      public int read(byte[] b, int off, int len) throws IOException
      Reads up to length bytes of data from the underlying streams into an array of bytes. An attempt is made to read as many as length bytes, but a smaller number may be read, possibly zero. The number of bytes actually read is returned as an integer.

      If length is zero, then no bytes are read and 0 is returned; otherwise, there is an attempt to read at least one byte.

      This method blocks until input data is available

      If this class in not done accepting input streams and the end of the last known stream is reached, this method will block forever unless another thread adds an input stream or interrupts.

      Overrides:
      read in class InputStream
      Parameters:
      b - Destination buffer
      off - Offset at which to start storing bytes
      len - Maximum number of bytes to read
      Returns:
      The number of bytes read, or -1 if the end of the stream has been reached
      Throws:
      IOException - - If an I/O error occurs
      NullPointerException - - If b is null.
      IndexOutOfBoundsException - - if length or offset are not possible.
    • skip

      public long skip(long n) throws IOException
      Skips over and discards n bytes of data from this input stream. The skip method may, for a variety of reasons, end up skipping over some smaller number of bytes, possibly 0. This may result from any of a number of conditions; reaching end of file before n bytes have been skipped is only one possibility. The actual number of bytes skipped is returned. If n is negative, no bytes are skipped.

      If this class in not done accepting input streams and the end of the last known stream is reached, this method will block forever unless another thread adds an input stream or interrupts.

      Overrides:
      skip in class InputStream
      Parameters:
      n - he number of characters to skip
      Returns:
      The number of characters actually skipped
      Throws:
      IOException - If an I/O error occurs
      Since:
      ostermillerutils 1.04.00
    • available

      public int available() throws IOException
      Returns the number of bytes that can be read (or skipped over) from this input stream without blocking by the next caller of a method for this input stream. The next caller might be the same thread or or another thread.
      Overrides:
      available in class InputStream
      Throws:
      IOException - If an I/O error occurs
      Since:
      ostermillerutils 1.04.00
    • close

      public void close() throws IOException
      Closes this input stream and releases any system resources associated with the stream.
      Specified by:
      close in interface AutoCloseable
      Specified by:
      close in interface Closeable
      Overrides:
      close in class InputStream
      Throws:
      IOException
      Since:
      ostermillerutils 1.04.00
    • mark

      public void mark(int readlimit)
      Mark not supported
      Overrides:
      mark in class InputStream
      Since:
      ostermillerutils 1.04.00
    • reset

      public void reset() throws IOException
      Reset not supported.
      Overrides:
      reset in class InputStream
      Throws:
      IOException - because reset is not supported.
      Since:
      ostermillerutils 1.04.00
    • markSupported

      public boolean markSupported()
      Does not support mark.
      Overrides:
      markSupported in class InputStream
      Returns:
      false
      Since:
      ostermillerutils 1.04.00