it.unimi.dsi.io
Class SegmentedInputStream

java.lang.Object
  extended by java.io.InputStream
      extended by it.unimi.dsi.fastutil.io.MeasurableInputStream
          extended by it.unimi.dsi.io.SegmentedInputStream
All Implemented Interfaces:
Closeable

public class SegmentedInputStream
extends 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
SegmentedInputStream(InputStream in)
          Creates a segmented input stream with no markers.
SegmentedInputStream(InputStream in, long... delimiter)
          Creats a stream with one marker in.
 
Method Summary
 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, read
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Constructor Detail

SegmentedInputStream

public SegmentedInputStream(InputStream in)
Creates a segmented input stream with no markers.

Parameters:
in - the underlying input stream.

SegmentedInputStream

public SegmentedInputStream(InputStream in,
                            long... delimiter)
                     throws NullPointerException,
                            IOException,
                            IllegalStateException
Creats a stream with one marker in.

Parameters:
in - the underlying input stream.
delimiter - an array of segment delimiters.
Throws:
NullPointerException
IOException
IllegalStateException
Method Detail

nextBlock

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

Throws:
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 IllegalArgumentException,
                     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:
IllegalArgumentException - if the elements of delimiter are negative or not increasing.
IOException

read

public int read()
         throws IOException
Specified by:
read in class InputStream
Throws:
IOException

read

public int read(byte[] b,
                int off,
                int len)
         throws IOException
Overrides:
read in class InputStream
Throws:
IOException

skip

public long skip(long n)
          throws IOException
Overrides:
skip in class InputStream
Throws:
IOException

available

public int available()
              throws IOException
Overrides:
available in class InputStream
Throws:
IOException

length

public long length()
            throws IOException
Specified by:
length in class MeasurableInputStream
Throws:
IOException

position

public long position()
              throws IOException
Specified by:
position in class MeasurableInputStream
Throws:
IOException

close

public void close()
           throws IOException
Skips to the next block, closing this segmented input stream if there are no more blocks.

Specified by:
close in interface Closeable
Overrides:
close in class InputStream
Throws:
IOException

reset

public void reset()
           throws IOException
Moves into the next segment of the current block.

Overrides:
reset in class InputStream
Throws:
IOException