csusky

常用链接

统计

最新评论

org.apache.lucene.store.RAMInputStream

该类是从RAMFile中读数据用的
最重要的一个方法:
该方法存在着从RAMFile的多个byte[1024]中读取数据的情况,所以应该在循环中进行处理

 public void readInternal(byte[] dest, int destOffset, int len) {
    int remainder = len;
    int start = pointer;
    while (remainder != 0) {
      int bufferNumber = start/BUFFER_SIZE; //  buffer的序号
      int bufferOffset = start%BUFFER_SIZE; //    buffer偏移量
      int bytesInBuffer = BUFFER_SIZE - bufferOffset;// 在当前buffer中剩下的字节数
      //如果缓冲区中剩余的字节大于len,则读出len长度的字节,如果不够则读出剩余的字节数
      // bytesToCopy表示实际读出的字节数
      int bytesToCopy = bytesInBuffer >= remainder ? remainder : bytesInBuffer;
      byte[] buffer = (byte[])file.buffers.elementAt(bufferNumber);
      System.arraycopy(buffer, bufferOffset, dest, destOffset, bytesToCopy);
      destOffset += bytesToCopy;       //增加已经复制的byte数据长度 到  dest中的偏移量
      start += bytesToCopy;                 //RAMFile文件指针,用来确定bufferNumber 和bytesInBuffer   相当于内存中的分页
      remainder -= bytesToCopy;       //剩余的还未复制的字节数
    }
    pointer += len;//文件指针位置
  }

posted on 2008-04-18 11:45 晓宇 阅读(208) 评论(0)  编辑  收藏 所属分类: LUCENE


只有注册用户登录后才能发表评论。


网站导航: