Methods Summary |
---|
public java.lang.Object | clone()
BufferedIndexInput clone = (BufferedIndexInput)super.clone();
if (buffer != null) {
clone.buffer = new byte[BUFFER_SIZE];
System.arraycopy(buffer, 0, clone.buffer, 0, bufferLength);
}
return clone;
|
public long | getFilePointer() return bufferStart + bufferPosition;
|
public byte | readByte() // next byte to read
if (bufferPosition >= bufferLength)
refill();
return buffer[bufferPosition++];
|
public void | readBytes(byte[] b, int offset, int len)
if (len < BUFFER_SIZE) {
for (int i = 0; i < len; i++) // read byte-by-byte
b[i + offset] = (byte)readByte();
} else { // read all-at-once
long start = getFilePointer();
seekInternal(start);
readInternal(b, offset, len);
bufferStart = start + len; // adjust stream variables
bufferPosition = 0;
bufferLength = 0; // trigger refill() on read
}
|
protected abstract void | readInternal(byte[] b, int offset, int length)Expert: implements buffer refill. Reads bytes from the current position
in the input.
|
private void | refill()
long start = bufferStart + bufferPosition;
long end = start + BUFFER_SIZE;
if (end > length()) // don't read past EOF
end = length();
bufferLength = (int)(end - start);
if (bufferLength <= 0)
throw new IOException("read past EOF");
if (buffer == null)
buffer = new byte[BUFFER_SIZE]; // allocate buffer lazily
readInternal(buffer, 0, bufferLength);
bufferStart = start;
bufferPosition = 0;
|
public void | seek(long pos)
if (pos >= bufferStart && pos < (bufferStart + bufferLength))
bufferPosition = (int)(pos - bufferStart); // seek within buffer
else {
bufferStart = pos;
bufferPosition = 0;
bufferLength = 0; // trigger refill() on read()
seekInternal(pos);
}
|
protected abstract void | seekInternal(long pos)Expert: implements seek. Sets current position in this file, where the
next {@link #readInternal(byte[],int,int)} will occur.
|