Class ISRandomAccessIO
- java.lang.Object
-
- jj2000.j2k.util.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 interfaceRandomAccessIO
- 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 interfaceRandomAccessIO
- 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 interfaceRandomAccessIO
- 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 interfaceRandomAccessIO
- 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 interfaceRandomAccessIO
- 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 interfaceRandomAccessIO
- 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 interfaceBinaryDataInput
- Specified by:
getByteOrdering
in interfaceBinaryDataOutput
- 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 interfaceBinaryDataInput
- 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 interfaceBinaryDataInput
- 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 interfaceBinaryDataInput
- 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 interfaceBinaryDataInput
- 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 interfaceBinaryDataInput
- 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 interfaceBinaryDataInput
- 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 interfaceBinaryDataInput
- 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 interfaceBinaryDataInput
- 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 interfaceBinaryDataInput
- 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 interfaceBinaryDataInput
- 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 interfaceBinaryDataOutput
-
write
public void write(int b) throws IOException
Throws an IOException since this class does not implement data output.- Specified by:
write
in interfaceRandomAccessIO
- 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 interfaceBinaryDataOutput
- 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 interfaceBinaryDataOutput
- 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 interfaceBinaryDataOutput
- 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 interfaceBinaryDataOutput
- 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 interfaceBinaryDataOutput
- 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 interfaceBinaryDataOutput
- Parameters:
v
- The value to write to the output- Throws:
IOException
- If an I/O error ocurred.
-
-