Package uk.ac.bristol.star.cdf.record
Class BankBuf
java.lang.Object
uk.ac.bristol.star.cdf.record.BankBuf
- All Implemented Interfaces:
Buf
Abstract Buf implementation that divides the byte sequence into one
or more contiguous data banks.
Each bank contains a run of bytes short enough to be indexed by
a 4-byte integer.
- Since:
- 18 Jun 2013
-
Nested Class Summary
Nested ClassesModifier and TypeClassDescriptionprotected static class
Data bank for use within BankBuf class and its subclasses. -
Constructor Summary
ConstructorsModifierConstructorDescriptionprotected
BankBuf
(long size, boolean isBit64, boolean isBigendian) Constructor. -
Method Summary
Modifier and TypeMethodDescriptioncreateInputStream
(long offset) Returns an input stream consisting of all the bytes in this buf starting from the given offset.static BankBuf
createMultiBankBuf
(ByteBuffer[] byteBuffers, boolean isBit64, boolean isBigendian) Returns a BankBuf based on an array of supplied ByteBuffers.static BankBuf
createMultiBankBuf
(FileChannel channel, long size, int bankSize, boolean isBit64, boolean isBigendian) Returns a BankBuf based on supplied file channel.static BankBuf
createSingleBankBuf
(ByteBuffer byteBuffer, boolean isBit64, boolean isBigendian) Returns a BankBuf based on a single supplied ByteBuffer.fillNewBuf
(long count, InputStream in) Creates a new Buf of a given length populated from a given input stream.protected abstract BankBuf.Bank
getBank
(long offset, int count) Returns the bank which can read a given number of bytes starting at the given offset.protected abstract Iterator<BankBuf.Bank>
getBankIterator
(long offset) Returns an iterator over banks starting with the one containing the given offset.protected abstract List<BankBuf.Bank>
Returns a list of active banks.long
Returns the extent of this buf in bytes.boolean
Determines the data encoding of this buf.boolean
isBit64()
Determines the 64bit-ness of this buf.readAsciiString
(Pointer ptr, int nbyte) Reads a fixed number of bytes interpreting them as ASCII characters and returns the result as a string.void
readDataBytes
(long offset, int count, byte[] array) Reads a sequence of byte values from this buf into an array.void
readDataDoubles
(long offset, int count, double[] array) Reads a sequence of double values from this buf into an array.void
readDataFloats
(long offset, int count, float[] array) Reads a sequence of float values from this buf into an array.void
readDataInts
(long offset, int count, int[] array) Reads a sequence of int values from this buf into an array.void
readDataLongs
(long offset, int count, long[] array) Reads a sequence of long integer values from this buf into an array.void
readDataShorts
(long offset, int count, short[] array) Reads a sequence of short values from this buf into an array.int
Reads a signed big-endian 4-byte integer from the pointer position.long
readOffset
(Pointer ptr) Reads a file offset or size from the pointer position.int
readUnsignedByte
(Pointer ptr) Reads a single byte from the pointer position, returning a value in the range 0..255.void
setBit64
(boolean isBit64) Sets the 64bit-ness of this buf.void
setEncoding
(boolean bigend) Sets the encoding for reading numeric values as performed by thereadData*
methods.
-
Constructor Details
-
BankBuf
protected BankBuf(long size, boolean isBit64, boolean isBigendian) Constructor.- Parameters:
size
- total size of bufferisBit64
- 64bit-ness of bufisBigendian
- true for big-endian data, false for little-endian
-
-
Method Details
-
getBank
Returns the bank which can read a given number of bytes starting at the given offset.Implementation: in most cases this will return one of the large banks that this object has allocated. However, in the case that the requested run straddles a bank boundary it may be necessary to generate a short-lived bank just to return from this method.
- Parameters:
offset
- start of required sequencecount
- number of bytes in required sequence- Returns:
- bank
- Throws:
IOException
-
getExistingBanks
Returns a list of active banks. Banks which have not been created yet do not need to be included. -
getBankIterator
Returns an iterator over banks starting with the one containing the given offset. If followed to the end, the returned sequence will go all the way to the end of the buf. The first bank does not need to start at the given offset, only to contain it.- Parameters:
offset
- starting byte offset into buf- Returns:
- iterator over data banks
-
getLength
public long getLength()Description copied from interface:Buf
Returns the extent of this buf in bytes. -
readUnsignedByte
Description copied from interface:Buf
Reads a single byte from the pointer position, returning a value in the range 0..255. Pointer position is moved on appropriately.- Specified by:
readUnsignedByte
in interfaceBuf
- Parameters:
ptr
- pointer- Returns:
- byte value
- Throws:
IOException
-
readInt
Description copied from interface:Buf
Reads a signed big-endian 4-byte integer from the pointer position. Pointer position is moved on appropriately.- Specified by:
readInt
in interfaceBuf
- Parameters:
ptr
- pointer- Returns:
- integer value
- Throws:
IOException
-
readOffset
Description copied from interface:Buf
Reads a file offset or size from the pointer position. This is a signed big-endian integer, occupying either 4 or 8 bytes according to the return value ofBuf.isBit64()
. Pointer position is moved on appropriately.- Specified by:
readOffset
in interfaceBuf
- Returns:
- buffer size or offset value
- Throws:
IOException
-
readAsciiString
Description copied from interface:Buf
Reads a fixed number of bytes interpreting them as ASCII characters and returns the result as a string. If a character 0x00 appears beforenbyte
bytes have been read, it is taken as the end of the string. Pointer position is moved on appropriately.- Specified by:
readAsciiString
in interfaceBuf
- Parameters:
ptr
- pointernbyte
- maximum number of bytes in string- Returns:
- ASCII string
- Throws:
IOException
-
setBit64
public void setBit64(boolean isBit64) Description copied from interface:Buf
Sets the 64bit-ness of this buf. This determines whetherreadOffset
reads 4- or 8-byte values.This method should be called before the
readOffset
method is invoked. -
isBit64
public boolean isBit64()Description copied from interface:Buf
Determines the 64bit-ness of this buf. This determines whetherreadOffset
reads 4- or 8-byte values. -
setEncoding
public void setEncoding(boolean bigend) Description copied from interface:Buf
Sets the encoding for reading numeric values as performed by thereadData*
methods.As currently specified, there are only two possibiliies, Big-Endian and Little-Endian. Interface and implementation would need to be reworked somewhat to accommodate the (presumably, rarely seen in this day and age) D_FLOAT and G_FLOAT encodings supported by the CDF standard.
This method should be called before any of the
readData*
methods are invoked.- Specified by:
setEncoding
in interfaceBuf
- Parameters:
bigend
- true for big-endian, false for little-endian
-
isBigendian
public boolean isBigendian()Description copied from interface:Buf
Determines the data encoding of this buf.- Specified by:
isBigendian
in interfaceBuf
- Returns:
- true for big-endian, false for little-endian
-
readDataBytes
Description copied from interface:Buf
Reads a sequence of byte values from this buf into an array.- Specified by:
readDataBytes
in interfaceBuf
- Parameters:
offset
- position sequence start in this buffer in bytescount
- number of byte values to readarray
- array to receive values, starting at array element 0- Throws:
IOException
-
readDataShorts
Description copied from interface:Buf
Reads a sequence of short values from this buf into an array.- Specified by:
readDataShorts
in interfaceBuf
- Parameters:
offset
- position sequence start in this buffer in bytescount
- number of short values to readarray
- array to receive values, starting at array element 0- Throws:
IOException
-
readDataInts
Description copied from interface:Buf
Reads a sequence of int values from this buf into an array.- Specified by:
readDataInts
in interfaceBuf
- Parameters:
offset
- position sequence start in this buffer in bytescount
- number of int values to readarray
- array to receive values, starting at array element 0- Throws:
IOException
-
readDataLongs
Description copied from interface:Buf
Reads a sequence of long integer values from this buf into an array.- Specified by:
readDataLongs
in interfaceBuf
- Parameters:
offset
- position sequence start in this buffer in bytescount
- number of long values to readarray
- array to receive values, starting at array element 0- Throws:
IOException
-
readDataFloats
Description copied from interface:Buf
Reads a sequence of float values from this buf into an array.- Specified by:
readDataFloats
in interfaceBuf
- Parameters:
offset
- position sequence start in this buffer in bytescount
- number of float values to readarray
- array to receive values, starting at array element 0- Throws:
IOException
-
readDataDoubles
Description copied from interface:Buf
Reads a sequence of double values from this buf into an array.- Specified by:
readDataDoubles
in interfaceBuf
- Parameters:
offset
- position sequence start in this buffer in bytescount
- number of double values to readarray
- array to receive values, starting at array element 0- Throws:
IOException
-
createInputStream
Description copied from interface:Buf
Returns an input stream consisting of all the bytes in this buf starting from the given offset.- Specified by:
createInputStream
in interfaceBuf
- Parameters:
offset
- position of first byte in buf that will appear in the returned stream- Returns:
- input stream
-
fillNewBuf
Description copied from interface:Buf
Creates a new Buf of a given length populated from a given input stream. The new buf object must have the same data encoding and 64bit-ness as this one.- Specified by:
fillNewBuf
in interfaceBuf
- Parameters:
count
- size of new buffer in bytesin
- input stream capable of supplying (at least)count
bytes- Returns:
- new buffer of length
count
filled with bytes fromin
- Throws:
IOException
-
createSingleBankBuf
public static BankBuf createSingleBankBuf(ByteBuffer byteBuffer, boolean isBit64, boolean isBigendian) Returns a BankBuf based on a single supplied ByteBuffer.- Parameters:
byteBuffer
- NIO buffer containing dataisBit64
- 64bit-ness of bufisBigendian
- true for big-endian data, false for little-endian- Returns:
- new buf
-
createMultiBankBuf
public static BankBuf createMultiBankBuf(ByteBuffer[] byteBuffers, boolean isBit64, boolean isBigendian) Returns a BankBuf based on an array of supplied ByteBuffers.- Parameters:
byteBuffers
- NIO buffers containing data (when concatenated)isBit64
- 64bit-ness of bufisBigendian
- true for big-endian data, false for little-endian- Returns:
- new buf
-
createMultiBankBuf
public static BankBuf createMultiBankBuf(FileChannel channel, long size, int bankSize, boolean isBit64, boolean isBigendian) Returns a BankBuf based on supplied file channel.- Parameters:
channel
- readable file containing datasize
- number of bytes in channelbankSize
- maximum size for individual data banksisBit64
- 64bit-ness of bufisBigendian
- true for big-endian data, false for little-endian- Returns:
- new buf
-