Class SegmentedInputStream

  • All Implemented Interfaces:
    it.unimi.dsi.fastutil.io.MeasurableStream, java.io.Closeable, java.lang.AutoCloseable

    public class SegmentedInputStream
    extends it.unimi.dsi.fastutil.io.MeasurableInputStream
    Exhibits a single InputStream as a number of streams divided into reset()-separated segments.

    An instance of this class wraps a given input stream (usually a replicable one, such as a FileInputStream) and exposes its contents as a number of separated input streams. Each such stream, called a block, is defined by a start and a stop position (gaps between blocks are possible). Inside each block we can have one or more segments: each segment is again a separate input stream, but calling reset() moves from one segment to the following one, whereas calling close() moves from a block to the following one.

    An instance of this class is enriched with blocks by calling addBlock(long[]). This can also be done on-the-fly, while the underlying input stream is being scanned.

    Author:
    Alessio Orlandi, Luca Natali, Sebastiano Vigna
    • Constructor Summary

      Constructors 
      Constructor Description
      SegmentedInputStream​(java.io.InputStream in)
      Creates a segmented input stream with no markers.
      SegmentedInputStream​(java.io.InputStream in, long... delimiter)
      Creats a stream with one marker in.
    • Method Summary

      All Methods Instance Methods Concrete Methods 
      Modifier and Type Method Description
      void addBlock​(long... delimiter)
      Adds a new block defined by its array of segment delimiters.
      int available()  
      void close()
      Skips to the next block, closing this segmented input stream if there are no more blocks.
      boolean hasMoreBlocks()
      Checks whether there are more blocks.
      long length()  
      void nextBlock()
      Skips to the first segment of the next block, if any.
      long position()  
      int read()  
      int read​(byte[] b, int off, int len)  
      void reset()
      Moves into the next segment of the current block.
      long skip​(long n)  
      • Methods inherited from class java.io.InputStream

        mark, markSupported, nullInputStream, read, readAllBytes, readNBytes, readNBytes, transferTo
      • Methods inherited from class java.lang.Object

        clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    • Constructor Detail

      • SegmentedInputStream

        public SegmentedInputStream​(java.io.InputStream in)
        Creates a segmented input stream with no markers.
        Parameters:
        in - the underlying input stream.
      • SegmentedInputStream

        public SegmentedInputStream​(java.io.InputStream in,
                                    long... delimiter)
                             throws java.lang.NullPointerException,
                                    java.io.IOException,
                                    java.lang.IllegalStateException
        Creats a stream with one marker in.
        Parameters:
        in - the underlying input stream.
        delimiter - an array of segment delimiters.
        Throws:
        java.lang.NullPointerException
        java.io.IOException
        java.lang.IllegalStateException
    • Method Detail

      • nextBlock

        public void nextBlock()
                       throws java.io.IOException
        Skips to the first segment of the next block, if any. In such case, it returns true, or false otherwise.
        Throws:
        java.io.IOException
      • hasMoreBlocks

        public boolean hasMoreBlocks()
        Checks whether there are more blocks.
        Returns:
        true if we there are more blocks.
      • addBlock

        public void addBlock​(long... delimiter)
                      throws java.lang.IllegalArgumentException,
                             java.io.IOException
        Adds a new block defined by its array of segment delimiters.

        The block has length defined by the difference between the last and first delimiter.

        This method performs the initial call to nextBlock() when the first marker is put in.

        Parameters:
        delimiter - a list of segment delimiters.
        Throws:
        java.lang.IllegalArgumentException - if the elements of delimiter are negative or not increasing.
        java.io.IOException
      • read

        public int read()
                 throws java.io.IOException
        Specified by:
        read in class java.io.InputStream
        Throws:
        java.io.IOException
      • read

        public int read​(byte[] b,
                        int off,
                        int len)
                 throws java.io.IOException
        Overrides:
        read in class java.io.InputStream
        Throws:
        java.io.IOException
      • skip

        public long skip​(long n)
                  throws java.io.IOException
        Overrides:
        skip in class java.io.InputStream
        Throws:
        java.io.IOException
      • available

        public int available()
                      throws java.io.IOException
        Overrides:
        available in class java.io.InputStream
        Throws:
        java.io.IOException
      • length

        public long length()
                    throws java.io.IOException
        Throws:
        java.io.IOException
      • position

        public long position()
                      throws java.io.IOException
        Throws:
        java.io.IOException
      • close

        public void close()
                   throws java.io.IOException
        Skips to the next block, closing this segmented input stream if there are no more blocks.
        Specified by:
        close in interface java.lang.AutoCloseable
        Specified by:
        close in interface java.io.Closeable
        Overrides:
        close in class java.io.InputStream
        Throws:
        java.io.IOException
      • reset

        public void reset()
                   throws java.io.IOException
        Moves into the next segment of the current block.
        Overrides:
        reset in class java.io.InputStream
        Throws:
        java.io.IOException