Class Output

  • All Implemented Interfaces:
    java.io.Closeable, java.io.Flushable, java.lang.AutoCloseable
    Direct Known Subclasses:
    ByteBufferOutput, OutputChunked

    public class Output
    extends java.io.OutputStream
    An OutputStream that buffers data in a byte array and optionally flushes to another OutputStream. Utility methods are provided for efficiently writing primitive types and strings. Encoding of integers: BIG_ENDIAN is used for storing fixed native size integer values LITTLE_ENDIAN is used for a variable length encoding of integer values
    • Constructor Summary

      Constructors 
      Constructor Description
      Output()
      Creates an uninitialized Output.
      Output​(byte[] buffer)
      Creates a new Output for writing to a byte array.
      Output​(byte[] buffer, int maxBufferSize)
      Creates a new Output for writing to a byte array.
      Output​(int bufferSize)
      Creates a new Output for writing to a byte array.
      Output​(int bufferSize, int maxBufferSize)
      Creates a new Output for writing to a byte array.
      Output​(java.io.OutputStream outputStream)
      Creates a new Output for writing to an OutputStream.
      Output​(java.io.OutputStream outputStream, int bufferSize)
      Creates a new Output for writing to an OutputStream.
    • Method Summary

      All Methods Static Methods Instance Methods Concrete Methods 
      Modifier and Type Method Description
      void clear()
      Sets the position and total to zero.
      void close()
      Flushes any buffered bytes and closes the underlying OutputStream, if any.
      void flush()
      Writes the buffered bytes to the underlying OutputStream, if any.
      byte[] getBuffer()
      Returns the buffer.
      java.io.OutputStream getOutputStream()  
      static int intLength​(int value, boolean optimizePositive)
      Returns the number of bytes that would be written with writeInt(int, boolean).
      static int longLength​(long value, boolean optimizePositive)
      Returns the number of bytes that would be written with writeLong(long, boolean).
      int position()
      Returns the current position in the buffer.
      protected boolean require​(int required)  
      void setBuffer​(byte[] buffer)
      Sets the buffer that will be written to.
      void setBuffer​(byte[] buffer, int maxBufferSize)
      Sets the buffer that will be written to.
      void setOutputStream​(java.io.OutputStream outputStream)
      Sets a new OutputStream.
      void setPosition​(int position)
      Sets the current position in the buffer.
      byte[] toBytes()
      Returns a new byte array containing the bytes currently in the buffer between zero and position().
      long total()
      Returns the total number of bytes written.
      void write​(byte[] bytes)
      Writes the bytes.
      void write​(byte[] bytes, int offset, int length)
      Writes the bytes.
      void write​(int value)
      Writes a byte.
      void writeAscii​(java.lang.String value)
      Writes a string that is known to contain only ASCII characters.
      private void writeAscii_slow​(java.lang.String value, int charCount)  
      void writeBoolean​(boolean value)
      Writes a 1 byte boolean.
      void writeByte​(byte value)  
      void writeByte​(int value)  
      void writeBytes​(byte[] bytes)
      Writes the bytes.
      void writeBytes​(byte[] bytes, int offset, int count)
      Writes the bytes.
      void writeChar​(char value)
      Writes a 2 byte char.
      void writeChars​(char[] object)
      Bulk output of a char array.
      void writeDouble​(double value)
      Writes an 8 byte double.
      int writeDouble​(double value, double precision, boolean optimizePositive)
      Writes a 1-9 byte double with reduced precision.
      void writeDoubles​(double[] object)
      Bulk output of a double array.
      void writeFloat​(float value)
      Writes a 4 byte float.
      int writeFloat​(float value, float precision, boolean optimizePositive)
      Writes a 1-5 byte float with reduced precision.
      void writeFloats​(float[] object)
      Bulk output of a float array.
      void writeInt​(int value)
      Writes a 4 byte int.
      int writeInt​(int value, boolean optimizePositive)
      Writes a 1-5 byte int.
      void writeInts​(int[] object)
      Bulk output of an int array.
      void writeInts​(int[] object, boolean optimizePositive)
      Bulk output of an int array.
      void writeLong​(long value)
      Writes an 8 byte long.
      int writeLong​(long value, boolean optimizePositive)
      Writes a 1-9 byte long.
      void writeLongs​(long[] object)
      Bulk output of an long array.
      void writeLongs​(long[] object, boolean optimizePositive)
      Bulk output of an long array.
      void writeShort​(int value)
      Writes a 2 byte short.
      void writeShorts​(short[] object)
      Bulk output of a short array.
      void writeString​(java.lang.CharSequence value)
      Writes the length and CharSequence as UTF8, or null.
      void writeString​(java.lang.String value)
      Writes the length and string, or null.
      private void writeString_slow​(java.lang.CharSequence value, int charCount, int charIndex)  
      private void writeUtf8Length​(int value)
      Writes the length of a string, which is a variable length encoded int except the first byte uses bit 8 to denote UTF8 and bit 7 to denote if another byte is present.
      int writeVarInt​(int value, boolean optimizePositive)
      Writes a 1-5 byte int.
      int writeVarLong​(long value, boolean optimizePositive)
      Writes a 1-9 byte long.
      • Methods inherited from class java.lang.Object

        clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    • Field Detail

      • maxCapacity

        protected int maxCapacity
      • total

        protected long total
      • position

        protected int position
      • capacity

        protected int capacity
      • buffer

        protected byte[] buffer
      • outputStream

        protected java.io.OutputStream outputStream
    • Constructor Detail

      • Output

        public Output()
        Creates an uninitialized Output. setBuffer(byte[], int) must be called before the Output is used.
      • Output

        public Output​(int bufferSize)
        Creates a new Output for writing to a byte array.
        Parameters:
        bufferSize - The initial and maximum size of the buffer. An exception is thrown if this size is exceeded.
      • Output

        public Output​(int bufferSize,
                      int maxBufferSize)
        Creates a new Output for writing to a byte array.
        Parameters:
        bufferSize - The initial size of the buffer.
        maxBufferSize - The buffer is doubled as needed until it exceeds maxBufferSize and an exception is thrown. Can be -1 for no maximum.
      • Output

        public Output​(byte[] buffer)
        Creates a new Output for writing to a byte array.
        See Also:
        setBuffer(byte[])
      • Output

        public Output​(byte[] buffer,
                      int maxBufferSize)
        Creates a new Output for writing to a byte array.
        See Also:
        setBuffer(byte[], int)
      • Output

        public Output​(java.io.OutputStream outputStream)
        Creates a new Output for writing to an OutputStream. A buffer size of 4096 is used.
      • Output

        public Output​(java.io.OutputStream outputStream,
                      int bufferSize)
        Creates a new Output for writing to an OutputStream.
    • Method Detail

      • getOutputStream

        public java.io.OutputStream getOutputStream()
      • setOutputStream

        public void setOutputStream​(java.io.OutputStream outputStream)
        Sets a new OutputStream. The position and total are reset, discarding any buffered bytes.
        Parameters:
        outputStream - May be null.
      • setBuffer

        public void setBuffer​(byte[] buffer)
        Sets the buffer that will be written to. setBuffer(byte[], int) is called with the specified buffer's length as the maxBufferSize.
      • setBuffer

        public void setBuffer​(byte[] buffer,
                              int maxBufferSize)
        Sets the buffer that will be written to. The position and total are reset, discarding any buffered bytes. The OutputStream is set to null.
        Parameters:
        maxBufferSize - The buffer is doubled as needed until it exceeds maxBufferSize and an exception is thrown.
      • getBuffer

        public byte[] getBuffer()
        Returns the buffer. The bytes between zero and position() are the data that has been written.
      • toBytes

        public byte[] toBytes()
        Returns a new byte array containing the bytes currently in the buffer between zero and position().
      • position

        public int position()
        Returns the current position in the buffer. This is the number of bytes that have not been flushed.
      • setPosition

        public void setPosition​(int position)
        Sets the current position in the buffer.
      • total

        public long total()
        Returns the total number of bytes written. This may include bytes that have not been flushed.
      • clear

        public void clear()
        Sets the position and total to zero.
      • require

        protected boolean require​(int required)
                           throws KryoException
        Returns:
        true if the buffer has been resized.
        Throws:
        KryoException
      • flush

        public void flush()
                   throws KryoException
        Writes the buffered bytes to the underlying OutputStream, if any.
        Specified by:
        flush in interface java.io.Flushable
        Overrides:
        flush in class java.io.OutputStream
        Throws:
        KryoException
      • close

        public void close()
                   throws KryoException
        Flushes any buffered bytes and closes the underlying OutputStream, if any.
        Specified by:
        close in interface java.lang.AutoCloseable
        Specified by:
        close in interface java.io.Closeable
        Overrides:
        close in class java.io.OutputStream
        Throws:
        KryoException
      • write

        public void write​(int value)
                   throws KryoException
        Writes a byte.
        Specified by:
        write in class java.io.OutputStream
        Throws:
        KryoException
      • write

        public void write​(byte[] bytes)
                   throws KryoException
        Writes the bytes. Note the byte[] length is not written.
        Overrides:
        write in class java.io.OutputStream
        Throws:
        KryoException
      • write

        public void write​(byte[] bytes,
                          int offset,
                          int length)
                   throws KryoException
        Writes the bytes. Note the byte[] length is not written.
        Overrides:
        write in class java.io.OutputStream
        Throws:
        KryoException
      • writeBytes

        public void writeBytes​(byte[] bytes)
                        throws KryoException
        Writes the bytes. Note the byte[] length is not written.
        Throws:
        KryoException
      • writeBytes

        public void writeBytes​(byte[] bytes,
                               int offset,
                               int count)
                        throws KryoException
        Writes the bytes. Note the byte[] length is not written.
        Throws:
        KryoException
      • writeInt

        public void writeInt​(int value)
                      throws KryoException
        Writes a 4 byte int. Uses BIG_ENDIAN byte order.
        Throws:
        KryoException
      • writeInt

        public int writeInt​(int value,
                            boolean optimizePositive)
                     throws KryoException
        Writes a 1-5 byte int. This stream may consider such a variable length encoding request as a hint. It is not guaranteed that a variable length encoding will be really used. The stream may decide to use native-sized integer representation for efficiency reasons.
        Parameters:
        optimizePositive - If true, small positive numbers will be more efficient (1 byte) and small negative numbers will be inefficient (5 bytes).
        Throws:
        KryoException
      • writeVarInt

        public int writeVarInt​(int value,
                               boolean optimizePositive)
                        throws KryoException
        Writes a 1-5 byte int. It is guaranteed that a varible length encoding will be used.
        Parameters:
        optimizePositive - If true, small positive numbers will be more efficient (1 byte) and small negative numbers will be inefficient (5 bytes).
        Throws:
        KryoException
      • writeAscii

        public void writeAscii​(java.lang.String value)
                        throws KryoException
        Writes a string that is known to contain only ASCII characters. Non-ASCII strings passed to this method will be corrupted. Each byte is a 7 bit character with the remaining byte denoting if another character is available. This is slightly more efficient than writeString(String). The string can be read using Input.readString() or Input.readStringBuilder().
        Parameters:
        value - May be null.
        Throws:
        KryoException
      • writeUtf8Length

        private void writeUtf8Length​(int value)
        Writes the length of a string, which is a variable length encoded int except the first byte uses bit 8 to denote UTF8 and bit 7 to denote if another byte is present.
      • writeString_slow

        private void writeString_slow​(java.lang.CharSequence value,
                                      int charCount,
                                      int charIndex)
      • writeAscii_slow

        private void writeAscii_slow​(java.lang.String value,
                                     int charCount)
                              throws KryoException
        Throws:
        KryoException
      • writeFloat

        public int writeFloat​(float value,
                              float precision,
                              boolean optimizePositive)
                       throws KryoException
        Writes a 1-5 byte float with reduced precision.
        Parameters:
        optimizePositive - If true, small positive numbers will be more efficient (1 byte) and small negative numbers will be inefficient (5 bytes).
        Throws:
        KryoException
      • writeShort

        public void writeShort​(int value)
                        throws KryoException
        Writes a 2 byte short. Uses BIG_ENDIAN byte order.
        Throws:
        KryoException
      • writeLong

        public void writeLong​(long value)
                       throws KryoException
        Writes an 8 byte long. Uses BIG_ENDIAN byte order.
        Throws:
        KryoException
      • writeLong

        public int writeLong​(long value,
                             boolean optimizePositive)
                      throws KryoException
        Writes a 1-9 byte long. This stream may consider such a variable length encoding request as a hint. It is not guaranteed that a variable length encoding will be really used. The stream may decide to use native-sized integer representation for efficiency reasons.
        Parameters:
        optimizePositive - If true, small positive numbers will be more efficient (1 byte) and small negative numbers will be inefficient (9 bytes).
        Throws:
        KryoException
      • writeVarLong

        public int writeVarLong​(long value,
                                boolean optimizePositive)
                         throws KryoException
        Writes a 1-9 byte long. It is guaranteed that a varible length encoding will be used.
        Parameters:
        optimizePositive - If true, small positive numbers will be more efficient (1 byte) and small negative numbers will be inefficient (9 bytes).
        Throws:
        KryoException
      • writeChar

        public void writeChar​(char value)
                       throws KryoException
        Writes a 2 byte char. Uses BIG_ENDIAN byte order.
        Throws:
        KryoException
      • writeDouble

        public int writeDouble​(double value,
                               double precision,
                               boolean optimizePositive)
                        throws KryoException
        Writes a 1-9 byte double with reduced precision.
        Parameters:
        optimizePositive - If true, small positive numbers will be more efficient (1 byte) and small negative numbers will be inefficient (9 bytes).
        Throws:
        KryoException
      • intLength

        public static int intLength​(int value,
                                    boolean optimizePositive)
        Returns the number of bytes that would be written with writeInt(int, boolean).
      • longLength

        public static int longLength​(long value,
                                     boolean optimizePositive)
        Returns the number of bytes that would be written with writeLong(long, boolean).
      • writeInts

        public void writeInts​(int[] object,
                              boolean optimizePositive)
                       throws KryoException
        Bulk output of an int array.
        Throws:
        KryoException
      • writeLongs

        public void writeLongs​(long[] object,
                               boolean optimizePositive)
                        throws KryoException
        Bulk output of an long array.
        Throws:
        KryoException
      • writeFloats

        public void writeFloats​(float[] object)
                         throws KryoException
        Bulk output of a float array.
        Throws:
        KryoException
      • writeShorts

        public void writeShorts​(short[] object)
                         throws KryoException
        Bulk output of a short array.
        Throws:
        KryoException
      • writeDoubles

        public void writeDoubles​(double[] object)
                          throws KryoException
        Bulk output of a double array.
        Throws:
        KryoException