Class ISRandomAccessIO

  • All Implemented Interfaces:
    BinaryDataInput, BinaryDataOutput, RandomAccessIO

    public class ISRandomAccessIO
    extends Object
    implements RandomAccessIO
    This class implements a wrapper to turn an InputStream into a RandomAccessIO. To provide random access the input data from the InputStream is cached in an in-memory buffer. The in-memory buffer size can be limited to a specified size. The data is read into the cache on a as needed basis, blocking only when necessary.

    The cache grows automatically as necessary. However, if the data length is known prior to the creation of a ISRandomAccessIO object, it is best to specify that as the initial in-memory buffer size. That will minimize data copying and multiple allocation.

    Multi-byte data is read in big-endian order. The in-memory buffer storage is released when 'close()' is called. This class can only be used for data input, not output. The wrapped InputStream is closed when all the input data is cached or when 'close()' is called.

    If an out of memory condition is encountered when growing the in-memory buffer an IOException is thrown instead of an OutOfMemoryError. The exception message is "Out of memory to cache input data".

    This class is intended for use as a "quick and dirty" way to give network connectivity to RandomAccessIO based classes. It is not intended as an efficient means of implementing network connectivity. Doing such requires reimplementing the RandomAccessIO based classes to directly use network connections.

    This class does not use temporary files as buffers, because that would preclude the use in unsigned applets.

    • Constructor Summary

      Constructors 
      Constructor Description
      ISRandomAccessIO​(InputStream is)
      Creates a new RandomAccessIO wrapper for the given InputStream 'is'.
      ISRandomAccessIO​(InputStream is, int size, int inc, int maxsize)
      Creates a new RandomAccessIO wrapper for the given InputStream 'is'.
    • Method Summary

      All Methods Instance Methods Concrete Methods 
      Modifier and Type Method Description
      void close()
      Closes this object for reading as well as the wrapped InputStream, if not already closed.
      void flush()
      Does nothing since this class does not implement data output.
      int getByteOrdering()
      Returns the endianess (i.e., byte ordering) of multi-byte I/O operations.
      int getPos()
      Returns the current position in the stream, which is the position from where the next byte of data would be read.
      int length()
      Returns the length of the stream.
      int read()
      Reads a byte of data from the stream.
      byte readByte()
      Reads a signed byte (8 bit) from the input.
      double readDouble()
      Reads an IEEE double precision (i.e., 64 bit) floating-point number from the input.
      float readFloat()
      Reads an IEEE single precision (i.e., 32 bit) floating-point number from the input.
      void readFully​(byte[] b, int off, int n)
      Reads 'len' bytes of data from this file into an array of bytes.
      int readInt()
      Reads a signed int (32 bit) from the input.
      long readLong()
      Reads a signed long (64 bit) from the input.
      short readShort()
      Reads a signed short (16 bit) from the input.
      int readUnsignedByte()
      Reads an unsigned byte (8 bit) from the input.
      long readUnsignedInt()
      Reads a unsigned int (32 bit) from the input.
      int readUnsignedShort()
      Reads an unsigned short (16 bit) from the input.
      void seek​(int off)
      Moves the current position for the next read operation to offset.
      int skipBytes​(int n)
      Skips 'n' bytes from the input.
      void write​(int b)
      Throws an IOException since this class does not implement data output.
      void writeByte​(int v)
      Throws an IOException since this class does not implement data output.
      void writeDouble​(double v)
      Throws an IOException since this class does not implement data output.
      void writeFloat​(float v)
      Throws an IOException since this class does not implement data output.
      void writeInt​(int v)
      Throws an IOException since this class does not implement data output.
      void writeLong​(long v)
      Throws an IOException since this class does not implement data output.
      void writeShort​(int v)
      Throws an IOException since this class does not implement data output.
    • Constructor Detail

      • ISRandomAccessIO

        public ISRandomAccessIO​(InputStream is,
                                int size,
                                int inc,
                                int maxsize)
        Creates a new RandomAccessIO wrapper for the given InputStream 'is'. The internal cache buffer will have size 'size' and will increment by 'inc' each time it is needed. The maximum buffer size is limited to 'maxsize'.
        Parameters:
        is - The input from where to get the data.
        size - The initial size for the cache buffer, in bytes.
        inc - The size increment for the cache buffer, in bytes.
        maxsize - The maximum size for the cache buffer, in bytes.
      • ISRandomAccessIO

        public ISRandomAccessIO​(InputStream is)
        Creates a new RandomAccessIO wrapper for the given InputStream 'is'. The internal cache buffer size and increment is to to 256 kB. The maximum buffer size is set to Integer.MAX_VALUE (2 GB).
        Parameters:
        is - The input from where to get the data.
    • Method Detail

      • close

        public void close()
                   throws IOException
        Closes this object for reading as well as the wrapped InputStream, if not already closed. The memory used by the cache is released.
        Specified by:
        close in interface RandomAccessIO
        Throws:
        IOException - If an I/O error occurs while closing the underlying InputStream.
      • getPos

        public int getPos()
                   throws IOException
        Returns the current position in the stream, which is the position from where the next byte of data would be read. The first byte in the stream is in position 0.
        Specified by:
        getPos in interface RandomAccessIO
        Returns:
        The offset of the current position, in bytes.
        Throws:
        IOException - If an I/O error occurred.
      • seek

        public void seek​(int off)
                  throws IOException
        Moves the current position for the next read operation to offset. The offset is measured from the beginning of the stream. If the offset is set beyond the currently cached data, the missing data will be read only when a read operation is performed. Setting the offset beyond the end of the data will cause an EOFException only if the data length is currently known, otherwise an IOException will occur when a read operation is attempted at that position.
        Specified by:
        seek in interface RandomAccessIO
        Parameters:
        off - The offset where to move to.
        Throws:
        EOFException - If seeking beyond EOF and the data length is known.
        IOException - If an I/O error ocurred.
      • length

        public int length()
                   throws IOException
        Returns the length of the stream. This will cause all the data to be read. This method will block until all the data is read, which can be lengthy across the network.
        Specified by:
        length in interface RandomAccessIO
        Returns:
        The length of the stream, in bytes.
        Throws:
        IOException - If an I/O error ocurred.
      • read

        public int read()
                 throws IOException
        Reads a byte of data from the stream.
        Specified by:
        read in interface RandomAccessIO
        Returns:
        The byte read, as an int in the range [0-255].
        Throws:
        EOFException - If the end-of file was reached.
        IOException - If an I/O error ocurred.
      • readFully

        public void readFully​(byte[] b,
                              int off,
                              int n)
                       throws IOException
        Reads 'len' bytes of data from this file into an array of bytes. This method reads repeatedly from the stream until all the bytes are read. This method blocks until all the bytes are read, the end of the stream is detected, or an exception is thrown.
        Specified by:
        readFully in interface RandomAccessIO
        Parameters:
        b - The buffer into which the data is to be read. It must be long enough.
        off - The index in 'b' where to place the first byte read.
        n - The number of bytes to read.
        Throws:
        EOFException - If the end-of file was reached before getting all the necessary data.
        IOException - If an I/O error ocurred.
      • getByteOrdering

        public int getByteOrdering()
        Returns the endianess (i.e., byte ordering) of multi-byte I/O operations. Always EndianType.BIG_ENDIAN since this class implements only big-endian.
        Specified by:
        getByteOrdering in interface BinaryDataInput
        Specified by:
        getByteOrdering in interface BinaryDataOutput
        Returns:
        Always EndianType.BIG_ENDIAN.
        See Also:
        EndianType
      • readByte

        public byte readByte()
                      throws IOException
        Reads a signed byte (8 bit) from the input.
        Specified by:
        readByte in interface BinaryDataInput
        Returns:
        The next byte-aligned signed byte (8 bit) from the input.
        Throws:
        EOFException - If the end-of file was reached before getting all the necessary data.
        IOException - If an I/O error ocurred.
      • readUnsignedByte

        public int readUnsignedByte()
                             throws IOException
        Reads an unsigned byte (8 bit) from the input.
        Specified by:
        readUnsignedByte in interface BinaryDataInput
        Returns:
        The next byte-aligned unsigned byte (8 bit) from the input.
        Throws:
        EOFException - If the end-of file was reached before getting all the necessary data.
        IOException - If an I/O error ocurred.
      • readShort

        public short readShort()
                        throws IOException
        Reads a signed short (16 bit) from the input.
        Specified by:
        readShort in interface BinaryDataInput
        Returns:
        The next byte-aligned signed short (16 bit) from the input.
        Throws:
        EOFException - If the end-of file was reached before getting all the necessary data.
        IOException - If an I/O error ocurred.
      • readUnsignedShort

        public int readUnsignedShort()
                              throws IOException
        Reads an unsigned short (16 bit) from the input.
        Specified by:
        readUnsignedShort in interface BinaryDataInput
        Returns:
        The next byte-aligned unsigned short (16 bit) from the input.
        Throws:
        EOFException - If the end-of file was reached before getting all the necessary data.
        IOException - If an I/O error ocurred.
      • readInt

        public int readInt()
                    throws IOException
        Reads a signed int (32 bit) from the input.
        Specified by:
        readInt in interface BinaryDataInput
        Returns:
        The next byte-aligned signed int (32 bit) from the input.
        Throws:
        EOFException - If the end-of file was reached before getting all the necessary data.
        IOException - If an I/O error ocurred.
      • readUnsignedInt

        public long readUnsignedInt()
                             throws IOException
        Reads a unsigned int (32 bit) from the input.
        Specified by:
        readUnsignedInt in interface BinaryDataInput
        Returns:
        The next byte-aligned unsigned int (32 bit) from the input.
        Throws:
        EOFException - If the end-of file was reached before getting all the necessary data.
        IOException - If an I/O error ocurred.
      • readLong

        public long readLong()
                      throws IOException
        Reads a signed long (64 bit) from the input.
        Specified by:
        readLong in interface BinaryDataInput
        Returns:
        The next byte-aligned signed long (64 bit) from the input.
        Throws:
        EOFException - If the end-of file was reached before getting all the necessary data.
        IOException - If an I/O error ocurred.
      • readFloat

        public float readFloat()
                        throws IOException
        Reads an IEEE single precision (i.e., 32 bit) floating-point number from the input.
        Specified by:
        readFloat in interface BinaryDataInput
        Returns:
        The next byte-aligned IEEE float (32 bit) from the input.
        Throws:
        EOFException - If the end-of file was reached before getting all the necessary data.
        IOException - If an I/O error ocurred.
      • readDouble

        public double readDouble()
                          throws IOException
        Reads an IEEE double precision (i.e., 64 bit) floating-point number from the input.
        Specified by:
        readDouble in interface BinaryDataInput
        Returns:
        The next byte-aligned IEEE double (64 bit) from the input.
        Throws:
        EOFException - If the end-of file was reached before getting all the necessary data.
        IOException - If an I/O error ocurred.
      • skipBytes

        public int skipBytes​(int n)
                      throws IOException
        Skips 'n' bytes from the input.
        Specified by:
        skipBytes in interface BinaryDataInput
        Parameters:
        n - The number of bytes to skip
        Returns:
        Always n.
        Throws:
        EOFException - If the end-of file was reached before all the bytes could be skipped.
        IOException - If an I/O error ocurred.
      • flush

        public void flush()
        Does nothing since this class does not implement data output.
        Specified by:
        flush in interface BinaryDataOutput
      • write

        public void write​(int b)
                   throws IOException
        Throws an IOException since this class does not implement data output.
        Specified by:
        write in interface RandomAccessIO
        Parameters:
        b - The byte to write. The lower 8 bits of b are written.
        Throws:
        IOException - If an I/O error ocurred.
      • writeByte

        public void writeByte​(int v)
                       throws IOException
        Throws an IOException since this class does not implement data output.
        Specified by:
        writeByte in interface BinaryDataOutput
        Parameters:
        v - The value to write to the output
        Throws:
        IOException - If an I/O error ocurred.
      • writeShort

        public void writeShort​(int v)
                        throws IOException
        Throws an IOException since this class does not implement data output.
        Specified by:
        writeShort in interface BinaryDataOutput
        Parameters:
        v - The value to write to the output
        Throws:
        IOException - If an I/O error ocurred.
      • writeInt

        public void writeInt​(int v)
                      throws IOException
        Throws an IOException since this class does not implement data output.
        Specified by:
        writeInt in interface BinaryDataOutput
        Parameters:
        v - The value to write to the output
        Throws:
        IOException - If an I/O error ocurred.
      • writeLong

        public void writeLong​(long v)
                       throws IOException
        Throws an IOException since this class does not implement data output.
        Specified by:
        writeLong in interface BinaryDataOutput
        Parameters:
        v - The value to write to the output
        Throws:
        IOException - If an I/O error ocurred.
      • writeFloat

        public void writeFloat​(float v)
                        throws IOException
        Throws an IOException since this class does not implement data output.
        Specified by:
        writeFloat in interface BinaryDataOutput
        Parameters:
        v - The value to write to the output
        Throws:
        IOException - If an I/O error ocurred.
      • writeDouble

        public void writeDouble​(double v)
                         throws IOException
        Throws an IOException since this class does not implement data output.
        Specified by:
        writeDouble in interface BinaryDataOutput
        Parameters:
        v - The value to write to the output
        Throws:
        IOException - If an I/O error ocurred.