Class ExposedByteArrayOutputStream

  • All Implemented Interfaces:
    Closeable, Flushable, AutoCloseable, org.jboss.marshalling.ByteOutput

    @NotThreadSafe
    public final class ExposedByteArrayOutputStream
    extends ByteArrayOutputStream
    implements org.jboss.marshalling.ByteOutput
    Extends ByteArrayOutputStream, but exposes the internal buffer. Using this, callers don't need to call toByteArray() which copies the internal buffer.

    Also overrides the superclass' behavior of always doubling the size of the internal buffer any time more capacity is needed. This class doubles the size until the internal buffer reaches a configurable max size (default is 4MB), after which it begins growing the buffer in 25% increments. This is intended to help prevent an OutOfMemoryError during a resize of a large buffer.

    A version of this class was originally created by Bela Ban as part of the JGroups library.

    This class is not threadsafe as it will not support concurrent readers and writers.

    Since:
    4.0
    Author:
    Brian Stansberry
    • Field Detail

      • DEFAULT_DOUBLING_SIZE

        public static final int DEFAULT_DOUBLING_SIZE
        Default buffer size after which if more buffer capacity is needed the buffer will grow by 25% rather than 100%
        See Also:
        Constant Field Values
    • Constructor Detail

      • ExposedByteArrayOutputStream

        public ExposedByteArrayOutputStream()
      • ExposedByteArrayOutputStream

        public ExposedByteArrayOutputStream​(int size)
      • ExposedByteArrayOutputStream

        public ExposedByteArrayOutputStream​(int size,
                                            int maxDoublingSize)
        Creates a new byte array output stream, with a buffer capacity of the specified size, in bytes.
        Parameters:
        size - the initial size.
        maxDoublingSize - the buffer size, after which if more capacity is needed the buffer will grow by 25% rather than 100%
        Throws:
        IllegalArgumentException - if size is negative.
    • Method Detail

      • getRawBuffer

        public final byte[] getRawBuffer()
        Gets the internal buffer array. Note that the length of this array will almost certainly be longer than the data written to it; call size() to get the number of bytes of actual data.
      • write

        public final void write​(byte[] b,
                                int off,
                                int len)
        Specified by:
        write in interface org.jboss.marshalling.ByteOutput
        Overrides:
        write in class ByteArrayOutputStream
      • write

        public final void write​(int b)
        Specified by:
        write in interface org.jboss.marshalling.ByteOutput
        Overrides:
        write in class ByteArrayOutputStream
      • getMaxDoublingSize

        public final int getMaxDoublingSize()
        Gets the highest internal buffer size after which if more capacity is needed the buffer will grow in 25% increments rather than 100%.
      • getNewBufferSize

        public final int getNewBufferSize​(int curSize,
                                          int minNewSize)
        Gets the number of bytes to which the internal buffer should be resized.
        Parameters:
        curSize - the current number of bytes
        minNewSize - the minimum number of bytes required
        Returns:
        the size to which the internal buffer should be resized
      • size

        public final int size()
        Overriden only to avoid unneeded synchronization
        Overrides:
        size in class ByteArrayOutputStream