FileDocCategorySizeDatePackage
BufferedIndexInput.javaAPI DocApache Lucene 1.93529Mon Feb 20 09:20:16 GMT 2006org.apache.lucene.store

BufferedIndexInput

public abstract class BufferedIndexInput extends IndexInput
Base implementation class for buffered {@link IndexInput}.

Fields Summary
static final int
BUFFER_SIZE
private byte[]
buffer
private long
bufferStart
private int
bufferLength
private int
bufferPosition
Constructors Summary
Methods Summary
public java.lang.Objectclone()

    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 longgetFilePointer()

 return bufferStart + bufferPosition; 
public bytereadByte()

		  // next byte to read

       
    if (bufferPosition >= bufferLength)
      refill();
    return buffer[bufferPosition++];
  
public voidreadBytes(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 voidreadInternal(byte[] b, int offset, int length)
Expert: implements buffer refill. Reads bytes from the current position in the input.

param
b the array to read bytes into
param
offset the offset in the array to start storing bytes
param
length the number of bytes to read

private voidrefill()

    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 voidseek(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 voidseekInternal(long pos)
Expert: implements seek. Sets current position in this file, where the next {@link #readInternal(byte[],int,int)} will occur.

see
#readInternal(byte[],int,int)