Package org.apache.derby.client.am
Class ByteArrayCombinerStream
java.lang.Object
java.io.InputStream
org.apache.derby.client.am.ByteArrayCombinerStream
- All Implemented Interfaces:
Closeable
,AutoCloseable
A stream whose source is a list of byte arrays.
This class was created when first implementing the JDBC 4 length less
overloads in the client driver. The reason was missing support for
streaming data with unknown length from the client to the server.
The purpose of the stream is to avoid having to repeatedly copy data to grow
the byte buffer, or doing a single big copy to combine the byte arrays in
the end. This is important for the temporary solution, since we must
materialize the stream to find the length anyway.
If there is less data available than the specified length, an exception is
thrown. Available data is determined by the length of the byte arrays, not
the contents of them. A byte array with all 0's is considered valid data.
Besides from truncation, this stream does not change the underlying data in
any way.
-
Field Summary
FieldsModifier and TypeFieldDescriptionprivate int
Index of the array we are currently reading from.private final ArrayList
<byte[]> A list of the arrays to combine.private byte[]
The array we are currently reading from.private long
Global offset into the whole stream.private int
The local offset into the current array.private final long
Length of the stream. -
Constructor Summary
ConstructorsConstructorDescriptionByteArrayCombinerStream
(ArrayList<byte[]> arraysIn, long length) Create a stream whose source is a list of byte arrays. -
Method Summary
Methods inherited from class java.io.InputStream
close, mark, markSupported, nullInputStream, read, readAllBytes, readNBytes, readNBytes, reset, skip, skipNBytes, transferTo
-
Field Details
-
arrays
A list of the arrays to combine. -
specifiedLength
private final long specifiedLengthLength of the stream. -
gOffset
private long gOffsetGlobal offset into the whole stream. -
arrayIndex
private int arrayIndexIndex of the array we are currently reading from. -
curArray
private byte[] curArrayThe array we are currently reading from. -
off
private int offThe local offset into the current array.
-
-
Constructor Details
-
ByteArrayCombinerStream
Create a stream whose source is a list of byte arrays.- Parameters:
arraysIn
- anArrayList
with references to the source byte arrays. The references are copied to a newArrayList
instance.length
- the length of the stream. Never published outside this object. Note that the length specified can be shorter than the actual number of bytes in the byte arrays.- Throws:
IllegalArgumentException
- if there is less data available than specified bylength
, orlength
is negative.
-
-
Method Details
-
read
Read a single byte.- Specified by:
read
in classInputStream
- Returns:
- a byte, or
-1
if the end-of-stream is reached - Throws:
IOException
-
read
Reads up to len bytes of data from the input stream into an array of bytes. An attempt is made to read as many aslen
bytes, but a smaller number may be read. The number of bytes actually read is returned as an integer.- Overrides:
read
in classInputStream
- Parameters:
buf
- the array to copy bytes intooffset
- offset into the arraylength
- the maximum number of bytes to read- Returns:
- the number of bytes read, or
-1
if end-of-stream is reached - Throws:
IOException
-
available
public int available()Return the number of available bytes. The method assumes the specified length of the stream is correct.- Overrides:
available
in classInputStream
- Returns:
- number of available bytes
-
nextArray
private byte[] nextArray()Fetch the next array to read data from. The reference in theArrayList
is cleared when the array is "taken out".- Returns:
- a
byte[]
-object, ornull
if there are no more arrays
-