Class RawToBinaryFormatStream

All Implemented Interfaces:
Closeable, AutoCloseable, Limit

public final class RawToBinaryFormatStream extends LimitInputStream
Stream that takes a raw input stream and converts it to the on-disk format of the binary types by prepending the length of the value.

If the length of the stream is known then it is encoded as the first bytes in the stream in the defined format.
If the length is unknown then the first four bytes will be zero, indicating unknown length.
Note: This stream cannot be re-used. Once end of file is reached, the next read call will throw an EOFException

See Also:
  • Field Details

    • encodedOffset

      private int encodedOffset
      Number of bytes of length encoding.
    • encodedLength

      private byte[] encodedLength
      Encoding of the length in bytes which will be seen as the first encodedLength.length bytes of this stream.
    • eof

      private boolean eof
    • length

      private final int length
      The length of the stream. Unknown if less than 0.
    • maximumLength

      private final int maximumLength
      The maximum allowed length for the stream. No limit if less than 0.
    • typeName

      private final String typeName
      The type of the column the stream is inserted into. Used for length less streams, null if not in use.
  • Constructor Details

    • RawToBinaryFormatStream

      public RawToBinaryFormatStream(InputStream in, int length)
      Create a binary on-disk stream from the given InputStream. The on-disk stream prepends a length encoding, and validates that the actual length of the stream matches the specified length (as according to JDBC 3.0).
      Parameters:
      in - application's raw binary stream passed into JDBC layer
      length - length of the stream
      Throws:
      IllegalArgumentException - if length is negative. This exception should never be exposed to the user, and seeing it means a programming error exists in the code.
    • RawToBinaryFormatStream

      public RawToBinaryFormatStream(InputStream in, int maximumLength, String typeName)
      Create a binary on-disk stream from the given InputStream of unknown length. A limit is placed on the maximum length of the stream.
      Parameters:
      in - the application stream
      maximumLength - maximum length of the column data is inserted into
      typeName - type name for the column data is inserted into
      Throws:
      IllegalArgumentException - if maximum length is negative, or type name is null. This exception should never be exposed to the user, and seeing it means a programming error exists in the code. Although a missing type name is not critical, an exception is is thrown to signal the intended use of this constructor.
  • Method Details

    • read

      public int read() throws IOException
      Read from the wrapped stream prepending the intial bytes if needed. If stream has been read, and eof reached, in that case any subsequent read will throw an EOFException
      Overrides:
      read in class LimitInputStream
      Throws:
      IOException
    • checkSufficientData

      private void checkSufficientData() throws IOException
      JDBC 3.0 (from tutorial book) requires that an input stream has the correct number of bytes in the stream.
      Throws:
      IOException
    • read

      public int read(byte[] b, int off, int len) throws IOException
      Read from the wrapped stream prepending the intial bytes if needed. If stream has been read, and eof reached, in that case any subsequent read will throw an EOFException
      Overrides:
      read in class LimitInputStream
      Throws:
      IOException