it.unimi.dsi.fastutil.io
Class InspectableFileCachedInputStream

java.lang.Object
  extended by java.io.InputStream
      extended by it.unimi.dsi.fastutil.io.MeasurableInputStream
          extended by it.unimi.dsi.fastutil.io.InspectableFileCachedInputStream
All Implemented Interfaces:
MeasurableStream, RepositionableStream, java.io.Closeable, java.nio.channels.Channel, java.nio.channels.WritableByteChannel

public class InspectableFileCachedInputStream
extends MeasurableInputStream
implements RepositionableStream, java.nio.channels.WritableByteChannel

A repositionable MeasurableInputStream based on cached data received by a WritableByteChannel whose first bytes can be inspected directly.

An instance of this class acts as a buffer holding the bytes written through its WritableByteChannel interface (which can be easily turned into an OutputStream using Channels.newOutputStream(WritableByteChannel)). The data can be discarded at any time using clear(). The first inspectable bytes of buffer contains the first bytes written. When buffer is full, the bytes are written to an overflow file.

At any time, the stream of bytes written since creation (or since the last clear()) are available as a fully implemented MeasurableInputStream which also implements RepositionableStream and supports marking. Note that you must arbitrate carefully write and read accesses, as it is always possible to call write(ByteBuffer) and thus modify the length of the MeasurableInputStream.

The method close() makes the MeasurableInputStream and WritableByteChannel state-changing methods temporarily throw an IOException, but does not otherwise modify the state of the stream (i.e., the stream can be cleared again). The method dispose() can be used to release the resources associated with the stream.

Buffering

This class provides no form of buffering except for the memory buffer described above, both when reading and when writing. Users should consider wrapping instances of this class with a FastBufferedInputStream, as reads after the buffer has been exhausted will be performed directly on a RandomAccessFile.


Field Summary
 byte[] buffer
          The inspection buffer.
static boolean DEBUG
           
static int DEFAULT_BUFFER_SIZE
          The default buffer size (64KiB).
 int inspectable
          The number of valid bytes currently in buffer.
 
Constructor Summary
InspectableFileCachedInputStream()
          Creates a new instance with default buffer size and overflow-file directory.
InspectableFileCachedInputStream(int bufferSize)
          Creates a new instance with specified buffer size and default overflow-file directory.
InspectableFileCachedInputStream(int bufferSize, java.io.File overflowFile)
          Creates a new instance with specified buffer size and overlow-file directory.
 
Method Summary
 int available()
           
 void clear()
          Clears the content of this InspectableFileCachedInputStream, zeroing the length of the represented stream.
 void close()
          Makes the stream unreadable until the next clear().
 void dispose()
          Disposes this stream, deleting the overflow file.
 boolean isOpen()
           
 long length()
          Returns the overall length of this stream (optional operation).
 void mark(int readlimit)
           
 boolean markSupported()
           
 long position()
          Returns the current stream position.
 void position(long position)
          Positions the input stream.
 int read()
           
 int read(byte[] b)
           
 int read(byte[] b, int offset, int length)
           
 void reset()
           
 long skip(long n)
           
 void truncate(long size)
          Truncates the overflow file to a given size if possible.
 int write(java.nio.ByteBuffer byteBuffer)
          Appends the content of a specified buffer to the end of the currently represented stream.
 
Methods inherited from class java.lang.Object
equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

DEBUG

public static final boolean DEBUG
See Also:
Constant Field Values

DEFAULT_BUFFER_SIZE

public static final int DEFAULT_BUFFER_SIZE
The default buffer size (64KiB).

See Also:
Constant Field Values

buffer

public final byte[] buffer
The inspection buffer. The first inspectable bytes contain the first part of the input stream. The buffer is available for inspection, but users should not modify its content.


inspectable

public int inspectable
The number of valid bytes currently in buffer.

Constructor Detail

InspectableFileCachedInputStream

public InspectableFileCachedInputStream(int bufferSize,
                                        java.io.File overflowFile)
                                 throws java.io.IOException
Creates a new instance with specified buffer size and overlow-file directory.

Parameters:
bufferSize - the buffer size, in bytes.
overflowFile - the directory where the overflow file should be created, or null for the default temporary directory.
Throws:
java.io.IOException

InspectableFileCachedInputStream

public InspectableFileCachedInputStream(int bufferSize)
                                 throws java.io.IOException
Creates a new instance with specified buffer size and default overflow-file directory.

Parameters:
bufferSize - the buffer size, in bytes.
Throws:
java.io.IOException

InspectableFileCachedInputStream

public InspectableFileCachedInputStream()
                                 throws java.io.IOException
Creates a new instance with default buffer size and overflow-file directory.

Throws:
java.io.IOException
Method Detail

clear

public void clear()
           throws java.io.IOException
Clears the content of this InspectableFileCachedInputStream, zeroing the length of the represented stream.

Throws:
java.io.IOException

write

public int write(java.nio.ByteBuffer byteBuffer)
          throws java.io.IOException
Appends the content of a specified buffer to the end of the currently represented stream.

Specified by:
write in interface java.nio.channels.WritableByteChannel
Parameters:
byteBuffer - a byte buffer.
Returns:
the number of bytes appended (i.e., byteBuffer.remaining()).
Throws:
java.io.IOException

truncate

public void truncate(long size)
              throws java.io.FileNotFoundException,
                     java.io.IOException
Truncates the overflow file to a given size if possible.

Parameters:
size - the new size; the final size is the maximum between the current write position (i.e., the length of the represented stream minus the length of the inspection buffer) and this value.
Throws:
java.io.FileNotFoundException
java.io.IOException

close

public void close()
           throws java.io.IOException
Makes the stream unreadable until the next clear().

Specified by:
close in interface java.io.Closeable
Specified by:
close in interface java.nio.channels.Channel
Overrides:
close in class java.io.InputStream
Throws:
java.io.IOException

dispose

public void dispose()
             throws java.io.IOException
Disposes this stream, deleting the overflow file. After that, the stream is unusable.

Throws:
java.io.IOException

available

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

read

public int read(byte[] b,
                int offset,
                int length)
         throws java.io.IOException
Overrides:
read in class java.io.InputStream
Throws:
java.io.IOException

read

public int read(byte[] b)
         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

read

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

length

public long length()
            throws java.io.IOException
Description copied from interface: MeasurableStream
Returns the overall length of this stream (optional operation). In most cases, this will require the stream to perform some extra action, possibly changing the state of the input stream itself (typically, reading all the bytes up to the end, or flushing on output stream). Implementing classes should always document what state will the input stream be in after calling this method, and which kind of exception could be thrown.

Specified by:
length in interface MeasurableStream
Throws:
java.io.IOException

position

public long position()
              throws java.io.IOException
Description copied from interface: RepositionableStream
Returns the current stream position.

Specified by:
position in interface MeasurableStream
Specified by:
position in interface RepositionableStream
Returns:
the current stream position.
Throws:
java.io.IOException

position

public void position(long position)
              throws java.io.IOException
Positions the input stream.

Specified by:
position in interface RepositionableStream
Parameters:
position - the new position (will be minimized with length()).
Throws:
java.io.IOException

isOpen

public boolean isOpen()
Specified by:
isOpen in interface java.nio.channels.Channel

mark

public void mark(int readlimit)
Overrides:
mark in class java.io.InputStream

reset

public void reset()
           throws java.io.IOException
Overrides:
reset in class java.io.InputStream
Throws:
java.io.IOException

markSupported

public boolean markSupported()
Overrides:
markSupported in class java.io.InputStream