Class VisibleBufferedInputStream

  • All Implemented Interfaces:
    java.io.Closeable, java.lang.AutoCloseable

    public class VisibleBufferedInputStream
    extends java.io.InputStream
    A faster version of BufferedInputStream. Does no synchronisation and allows direct access to the used byte[] buffer.
    • Field Summary

      Fields 
      Modifier and Type Field Description
      private byte[] buffer
      The buffer.
      private int endIndex
      How far is the buffer filled with valid data.
      private int index
      Current read position in the buffer.
      private static int MINIMUM_READ
      If a direct read to byte array is called that would require a smaller read from the wrapped stream that MINIMUM_READ then first fill the buffer and serve the bytes from there.
      private static int STRING_SCAN_SPAN
      In how large spans is the C string zero-byte scanned.
      private boolean timeoutRequested
      socket timeout has been requested
      private java.io.InputStream wrapped
      The wrapped input stream.
    • Constructor Summary

      Constructors 
      Constructor Description
      VisibleBufferedInputStream​(java.io.InputStream in, int bufferSize)
      Creates a new buffer around the given stream.
    • Method Summary

      All Methods Instance Methods Concrete Methods 
      Modifier and Type Method Description
      int available()
      void close()
      private void compact()
      Compacts the unread bytes of the buffer to the beginning of the buffer.
      private void doubleBuffer()
      Doubles the size of the buffer.
      boolean ensureBytes​(int n)
      Ensures that the buffer contains at least n bytes.
      boolean ensureBytes​(int n, boolean block)
      Ensures that the buffer contains at least n bytes.
      byte[] getBuffer()
      Returns direct handle to the used buffer.
      int getIndex()
      Returns the current read position in the buffer.
      private void moveBufferTo​(byte[] dest)
      Moves bytes from the buffer to the beginning of the destination buffer.
      int peek()
      Reads a byte from the buffer without advancing the index pointer.
      int read()
      int read​(byte[] to, int off, int len)
      private boolean readMore​(int wanted, boolean block)
      Reads more bytes into the buffer.
      byte readRaw()
      Reads byte from the buffer without any checks.
      int scanCStringLength()
      Scans the length of the next null terminated string (C-style string) from the stream.
      void setTimeoutRequested​(boolean timeoutRequested)  
      long skip​(long n)
      • Methods inherited from class java.io.InputStream

        mark, markSupported, nullInputStream, read, readAllBytes, readNBytes, readNBytes, reset, transferTo
      • Methods inherited from class java.lang.Object

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

      • MINIMUM_READ

        private static final int MINIMUM_READ
        If a direct read to byte array is called that would require a smaller read from the wrapped stream that MINIMUM_READ then first fill the buffer and serve the bytes from there. Larger reads are directly done to the provided byte array.
        See Also:
        Constant Field Values
      • STRING_SCAN_SPAN

        private static final int STRING_SCAN_SPAN
        In how large spans is the C string zero-byte scanned.
        See Also:
        Constant Field Values
      • wrapped

        private final java.io.InputStream wrapped
        The wrapped input stream.
      • buffer

        private byte[] buffer
        The buffer.
      • index

        private int index
        Current read position in the buffer.
      • endIndex

        private int endIndex
        How far is the buffer filled with valid data.
      • timeoutRequested

        private boolean timeoutRequested
        socket timeout has been requested
    • Constructor Detail

      • VisibleBufferedInputStream

        public VisibleBufferedInputStream​(java.io.InputStream in,
                                          int bufferSize)
        Creates a new buffer around the given stream.
        Parameters:
        in - The stream to buffer.
        bufferSize - The initial size of the buffer.
    • Method Detail

      • read

        public int read()
                 throws java.io.IOException
        Specified by:
        read in class java.io.InputStream
        Throws:
        java.io.IOException
      • peek

        public int peek()
                 throws java.io.IOException
        Reads a byte from the buffer without advancing the index pointer.
        Returns:
        byte from the buffer without advancing the index pointer
        Throws:
        java.io.IOException - if something wrong happens
      • readRaw

        public byte readRaw()
        Reads byte from the buffer without any checks. This method never reads from the underlaying stream. Before calling this method the ensureBytes(int) method must have been called.
        Returns:
        The next byte from the buffer.
        Throws:
        java.lang.ArrayIndexOutOfBoundsException - If ensureBytes was not called to make sure the buffer contains the byte.
      • ensureBytes

        public boolean ensureBytes​(int n)
                            throws java.io.IOException
        Ensures that the buffer contains at least n bytes. This method invalidates the buffer and index fields.
        Parameters:
        n - The amount of bytes to ensure exists in buffer
        Returns:
        true if required bytes are available and false if EOF
        Throws:
        java.io.IOException - If reading of the wrapped stream failed.
      • ensureBytes

        public boolean ensureBytes​(int n,
                                   boolean block)
                            throws java.io.IOException
        Ensures that the buffer contains at least n bytes. This method invalidates the buffer and index fields.
        Parameters:
        n - The amount of bytes to ensure exists in buffer
        block - whether or not to block the IO
        Returns:
        true if required bytes are available and false if EOF or the parameter block was false and socket timeout occurred.
        Throws:
        java.io.IOException - If reading of the wrapped stream failed.
      • readMore

        private boolean readMore​(int wanted,
                                 boolean block)
                          throws java.io.IOException
        Reads more bytes into the buffer.
        Parameters:
        wanted - How much should be at least read.
        Returns:
        True if at least some bytes were read.
        Throws:
        java.io.IOException - If reading of the wrapped stream failed.
      • doubleBuffer

        private void doubleBuffer()
        Doubles the size of the buffer.
      • compact

        private void compact()
        Compacts the unread bytes of the buffer to the beginning of the buffer.
      • moveBufferTo

        private void moveBufferTo​(byte[] dest)
        Moves bytes from the buffer to the beginning of the destination buffer. Also sets the index and endIndex variables.
        Parameters:
        dest - The destination buffer.
      • read

        public int read​(byte[] to,
                        int off,
                        int len)
                 throws java.io.IOException
        Overrides:
        read in class java.io.InputStream
        Throws:
        java.io.IOException
      • skip

        public long skip​(long n)
                  throws java.io.IOException
        Overrides:
        skip in class java.io.InputStream
        Throws:
        java.io.IOException
      • available

        public int available()
                      throws java.io.IOException
        Overrides:
        available in class java.io.InputStream
        Throws:
        java.io.IOException
      • close

        public void close()
                   throws java.io.IOException
        Specified by:
        close in interface java.lang.AutoCloseable
        Specified by:
        close in interface java.io.Closeable
        Overrides:
        close in class java.io.InputStream
        Throws:
        java.io.IOException
      • getBuffer

        public byte[] getBuffer()
        Returns direct handle to the used buffer. Use the ensureBytes(int) to prefill required bytes the buffer and getIndex() to fetch the current position of the buffer.
        Returns:
        The underlaying buffer.
      • getIndex

        public int getIndex()
        Returns the current read position in the buffer.
        Returns:
        the current read position in the buffer.
      • scanCStringLength

        public int scanCStringLength()
                              throws java.io.IOException
        Scans the length of the next null terminated string (C-style string) from the stream.
        Returns:
        The length of the next null terminated string.
        Throws:
        java.io.IOException - If reading of stream fails.
        java.io.EOFException - If the stream did not contain any null terminators.
      • setTimeoutRequested

        public void setTimeoutRequested​(boolean timeoutRequested)