Package org.postgresql.core
Class VisibleBufferedInputStream
- java.lang.Object
-
- java.io.InputStream
-
- org.postgresql.core.VisibleBufferedInputStream
-
- All Implemented Interfaces:
java.io.Closeable,java.lang.AutoCloseable
public class VisibleBufferedInputStream extends java.io.InputStreamA 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[]bufferThe buffer.private intendIndexHow far is the buffer filled with valid data.private intindexCurrent read position in the buffer.private static intMINIMUM_READIf 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 intSTRING_SCAN_SPANIn how large spans is the C string zero-byte scanned.private booleantimeoutRequestedsocket timeout has been requestedprivate java.io.InputStreamwrappedThe 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 intavailable()voidclose()private voidcompact()Compacts the unread bytes of the buffer to the beginning of the buffer.private voiddoubleBuffer()Doubles the size of the buffer.booleanensureBytes(int n)Ensures that the buffer contains at least n bytes.booleanensureBytes(int n, boolean block)Ensures that the buffer contains at least n bytes.byte[]getBuffer()Returns direct handle to the used buffer.intgetIndex()Returns the current read position in the buffer.java.io.InputStreamgetWrapped()Returns the underlying stream.private voidmoveBufferTo(byte[] dest)Moves bytes from the buffer to the beginning of the destination buffer.intpeek()Reads a byte from the buffer without advancing the index pointer.intread()intread(byte[] to, int off, int len)intreadInt2()Reads an int2 value from the underlying stream as an unsigned integer (0..65535).intreadInt4()Reads an int4 value from the underlying stream.private booleanreadMore(int wanted, boolean block)Reads more bytes into the buffer.bytereadRaw()Reads byte from the buffer without any checks.intscanCStringLength()Scans the length of the next null terminated string (C-style string) from the stream.voidsetTimeoutRequested(boolean timeoutRequested)longskip(long n)
-
-
-
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
-
-
Method Detail
-
read
public int read() throws java.io.IOException- Specified by:
readin classjava.io.InputStream- Throws:
java.io.IOException
-
readInt2
public int readInt2() throws java.io.IOExceptionReads an int2 value from the underlying stream as an unsigned integer (0..65535).- Returns:
- int2 in the range of 0..65535
- Throws:
java.io.IOException- if an I/ O error occurs.
-
readInt4
public int readInt4() throws java.io.IOExceptionReads an int4 value from the underlying stream.- Returns:
- int4 value from the underlying stream
- Throws:
java.io.IOException- if an I/ O error occurs.
-
peek
public int peek() throws java.io.IOExceptionReads 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 underlying stream. Before calling this method theensureBytes(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.IOExceptionEnsures 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.IOExceptionEnsures 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 bufferblock- 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.IOExceptionReads 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:
readin classjava.io.InputStream- Throws:
java.io.IOException
-
skip
public long skip(long n) throws java.io.IOException- Overrides:
skipin classjava.io.InputStream- Throws:
java.io.IOException
-
available
public int available() throws java.io.IOException- Overrides:
availablein classjava.io.InputStream- Throws:
java.io.IOException
-
close
public void close() throws java.io.IOException- Specified by:
closein interfacejava.lang.AutoCloseable- Specified by:
closein interfacejava.io.Closeable- Overrides:
closein classjava.io.InputStream- Throws:
java.io.IOException
-
getBuffer
public byte[] getBuffer()
Returns direct handle to the used buffer. Use theensureBytes(int)to prefill required bytes the buffer andgetIndex()to fetch the current position of the buffer.- Returns:
- The underlying 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.IOExceptionScans 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)
-
getWrapped
public java.io.InputStream getWrapped()
Returns the underlying stream.- Returns:
- the underlying stream
-
-