Class ByteBuffersDataOutput

    • Field Detail

      • EMPTY

        private static final java.nio.ByteBuffer EMPTY
      • EMPTY_BYTE_ARRAY

        private static final byte[] EMPTY_BYTE_ARRAY
      • ALLOCATE_BB_ON_HEAP

        public static final java.util.function.IntFunction<java.nio.ByteBuffer> ALLOCATE_BB_ON_HEAP
      • NO_REUSE

        public static final java.util.function.Consumer<java.nio.ByteBuffer> NO_REUSE
        A singleton instance of "no-reuse" buffer strategy.
      • DEFAULT_MIN_BITS_PER_BLOCK

        public static final int DEFAULT_MIN_BITS_PER_BLOCK
        Default minBitsPerBlock
        See Also:
        Constant Field Values
      • DEFAULT_MAX_BITS_PER_BLOCK

        public static final int DEFAULT_MAX_BITS_PER_BLOCK
        Default maxBitsPerBlock
        See Also:
        Constant Field Values
      • LIMIT_MIN_BITS_PER_BLOCK

        public static final int LIMIT_MIN_BITS_PER_BLOCK
        Smallest minBitsPerBlock allowed
        See Also:
        Constant Field Values
      • LIMIT_MAX_BITS_PER_BLOCK

        public static final int LIMIT_MAX_BITS_PER_BLOCK
        Largest maxBitsPerBlock allowed
        See Also:
        Constant Field Values
      • MAX_BLOCKS_BEFORE_BLOCK_EXPANSION

        static final int MAX_BLOCKS_BEFORE_BLOCK_EXPANSION
        Maximum number of blocks at the current blockBits block size before we increase the block size (and thus decrease the number of blocks).
        See Also:
        Constant Field Values
      • maxBitsPerBlock

        private final int maxBitsPerBlock
        Maximum block size: 2^bits.
      • blockAllocate

        private final java.util.function.IntFunction<java.nio.ByteBuffer> blockAllocate
        ByteBuffer supplier.
      • blockReuse

        private final java.util.function.Consumer<java.nio.ByteBuffer> blockReuse
        ByteBuffer recycler on reset().
      • blockBits

        private int blockBits
        Current block size: 2^bits.
      • blocks

        private final java.util.ArrayDeque<java.nio.ByteBuffer> blocks
        Blocks storing data.
      • ramBytesUsed

        private long ramBytesUsed
        Cumulative RAM usage across all blocks.
      • currentBlock

        private java.nio.ByteBuffer currentBlock
        The current-or-next write block.
    • Constructor Detail

      • ByteBuffersDataOutput

        public ByteBuffersDataOutput​(long expectedSize)
        Create a new output, suitable for writing a file of around expectedSize bytes.

        Memory allocation will be optimized based on the expectedSize hint, so that there is less overhead for larger files.

        Parameters:
        expectedSize - estimated size of the output file
      • ByteBuffersDataOutput

        public ByteBuffersDataOutput()
        Creates a new output with all defaults.
      • ByteBuffersDataOutput

        public ByteBuffersDataOutput​(int minBitsPerBlock,
                                     int maxBitsPerBlock,
                                     java.util.function.IntFunction<java.nio.ByteBuffer> blockAllocate,
                                     java.util.function.Consumer<java.nio.ByteBuffer> blockReuse)
        Expert: Creates a new output with custom parameters.
        Parameters:
        minBitsPerBlock - minimum bits per block
        maxBitsPerBlock - maximum bits per block
        blockAllocate - block allocator
        blockReuse - block recycler
    • Method Detail

      • writeByte

        public void writeByte​(byte b)
        Description copied from class: DataOutput
        Writes a single byte.

        The most primitive data type is an eight-bit byte. Files are accessed as sequences of bytes. All other data types are defined as sequences of bytes, so file formats are byte-order independent.

        Specified by:
        writeByte in class DataOutput
        See Also:
        DataInput.readByte()
      • writeBytes

        public void writeBytes​(byte[] src,
                               int offset,
                               int length)
        Description copied from class: DataOutput
        Writes an array of bytes.
        Specified by:
        writeBytes in class DataOutput
        Parameters:
        src - the bytes to write
        offset - the offset in the byte array
        length - the number of bytes to write
        See Also:
        DataInput.readBytes(byte[],int,int)
      • writeBytes

        public void writeBytes​(byte[] b)
      • writeBytes

        public void writeBytes​(java.nio.ByteBuffer buffer)
      • toBufferList

        public java.util.ArrayList<java.nio.ByteBuffer> toBufferList()
        Return a list of read-only view of ByteBuffer blocks over the current content written to the output.
      • toWriteableBufferList

        public java.util.ArrayList<java.nio.ByteBuffer> toWriteableBufferList()
        Returns a list of writeable blocks over the (source) content buffers.

        This method returns the raw content of source buffers that may change over the lifetime of this object (blocks can be recycled or discarded, for example). Most applications should favor calling toBufferList() which returns a read-only view over the content of the source buffers.

        The difference between toBufferList() and toWriteableBufferList() is that read-only view of source buffers will always return false from ByteBuffer.hasArray() (which sometimes may be required to avoid double copying).

      • toArrayCopy

        public byte[] toArrayCopy()
        Return a contiguous array with the current content written to the output. The returned array is always a copy (can be mutated).

        If the size() of the underlying buffers exceeds maximum size of Java array, an RuntimeException will be thrown.

      • copyTo

        public void copyTo​(DataOutput output)
                    throws java.io.IOException
        Copy the current content of this object into another DataOutput.
        Throws:
        java.io.IOException
      • size

        public long size()
        Returns:
        The number of bytes written to this output so far.
      • toString

        public java.lang.String toString()
        Overrides:
        toString in class java.lang.Object
      • writeString

        public void writeString​(java.lang.String v)
        Description copied from class: DataOutput
        Writes a string.

        Writes strings as UTF-8 encoded bytes. First the length, in bytes, is written as a VInt, followed by the bytes.

        Overrides:
        writeString in class DataOutput
        See Also:
        DataInput.readString()
      • writeMapOfStrings

        public void writeMapOfStrings​(java.util.Map<java.lang.String,​java.lang.String> map)
        Description copied from class: DataOutput
        Writes a String map.

        First the size is written as an vInt, followed by each key-value pair written as two consecutive Strings.

        Overrides:
        writeMapOfStrings in class DataOutput
        Parameters:
        map - Input map.
      • writeSetOfStrings

        public void writeSetOfStrings​(java.util.Set<java.lang.String> set)
        Description copied from class: DataOutput
        Writes a String set.

        First the size is written as an vInt, followed by each value written as a String.

        Overrides:
        writeSetOfStrings in class DataOutput
        Parameters:
        set - Input set.
      • ramBytesUsed

        public long ramBytesUsed()
        Description copied from interface: Accountable
        Return the memory usage of this object in bytes. Negative values are illegal.
        Specified by:
        ramBytesUsed in interface Accountable
      • reset

        public void reset()
        This method resets this object to a clean (zero-size) state and publishes any currently allocated buffers for reuse to the reuse strategy provided in the constructor.

        Sharing byte buffers for reads and writes is dangerous and will very likely lead to hard-to-debug issues, use with great care.

      • blockSize

        private int blockSize()
      • appendBlock

        private void appendBlock()
      • rewriteToBlockSize

        private void rewriteToBlockSize​(int targetBlockBits)
      • computeBlockSizeBitsFor

        private static int computeBlockSizeBitsFor​(long bytes)
      • UTF16toUTF8

        private static int UTF16toUTF8​(java.lang.CharSequence s,
                                       int offset,
                                       int length,
                                       byte[] buf,
                                       java.util.function.IntConsumer bufferFlusher)
        A consumer-based UTF16-UTF8 encoder (writes the input string in smaller buffers.).