StreamStore
A facility to store streams in a map. Streams are split into blocks, which
are stored in a map. Very small streams are inlined in the stream id.
The key of the map is a long (incremented for each stored block). The default
initial value is 0. Before storing blocks into the map, the stream store
checks if there is already a block with the next key, and if necessary
searches the next free entry using a binary search (0 to Long.MAX_VALUE).
Before storing
The format of the binary id is: An empty id represents 0 bytes of data.
In-place data is encoded as 0, the size (a variable size int), then the data.
A stored block is encoded as 1, the length of the block (a variable size
int), then the key (a variable size long). Multiple ids can be concatenated
to concatenate the data. If the id is large, it is stored itself, which is
encoded as 2, the total length (a variable size long), and the key of the
block that contains the id (a variable size long).
| Methods |
| static String |
toString(byte[] id)
Convert the id to a human readable string.
|
| static String |
toString(byte[] id)
Convert the id to a human readable string.
Parameters:
id - the stream id
Returns:
the string
|
|
StreamStore(Map map)
Create a stream store instance.
|
|
StreamStore(Map map)
Create a stream store instance.
Parameters:
map - the map to store blocks of data
|
| InputStream |
get(byte[] id)
Open an input stream to read data.
|
| InputStream |
get(byte[] id)
Open an input stream to read data.
Parameters:
id - the id
Returns:
the stream
|
| byte[] |
getBlock(long key)
Get the block.
|
| byte[] |
getBlock(long key)
Get the block.
Parameters:
key - the key
Returns:
the block
|
| Map |
getMap()
|
| Map |
getMap()
|
| long |
getMaxBlockKey(byte[] id)
Get the key of the biggest block, of -1 for inline data.
|
| long |
getMaxBlockKey(byte[] id)
Get the key of the biggest block, of -1 for inline data.
This method is used to garbage collect orphaned blocks.
Parameters:
id - the id
Returns:
the key, or -1
|
| long |
getMaxBlockSize()
|
| long |
getMaxBlockSize()
|
| int |
getMinBlockSize()
|
| int |
getMinBlockSize()
|
| long |
getNextKey()
|
| long |
getNextKey()
|
| boolean |
isInPlace(byte[] id)
Check whether the id itself contains all the data.
|
| boolean |
isInPlace(byte[] id)
Check whether the id itself contains all the data. This operation does
not cause any reads in the map.
Parameters:
id - the id
Returns:
if the id contains the data
|
| long |
length(byte[] id)
Calculate the number of data bytes for the given id.
|
| long |
length(byte[] id)
Calculate the number of data bytes for the given id. As the length is
encoded in the id, this operation does not cause any reads in the map.
Parameters:
id - the id
Returns:
the length
|
| void |
onStore(int len)
This method is called after a block of data is stored.
|
| void |
onStore(int len)
This method is called after a block of data is stored. Override this
method to persist data if necessary.
Parameters:
len - the length of the stored block.
|
| byte[] |
put(InputStream in)
Store the stream, and return the id.
|
| byte[] |
put(InputStream in) throws IOException
Store the stream, and return the id. The stream is not closed.
Parameters:
in - the stream
Returns:
the id (potentially an empty array)
|
| void |
remove(byte[] id)
Remove all stored blocks for the given id.
|
| void |
remove(byte[] id)
Remove all stored blocks for the given id.
Parameters:
id - the id
|
| void |
setMaxBlockSize(int maxBlockSize)
Set the maximum block size.
|
| void |
setMaxBlockSize(int maxBlockSize)
Set the maximum block size. The default is 256 KB.
Parameters:
maxBlockSize - the new value
|
| void |
setMinBlockSize(int minBlockSize)
Set the minimum block size.
|
| void |
setMinBlockSize(int minBlockSize)
Set the minimum block size. The default is 256 bytes.
Parameters:
minBlockSize - the new value
|
| void |
setNextKey(long nextKey)
|
| void |
setNextKey(long nextKey)
|