csusky

常用链接

统计

最新评论

org.apache.lucene.store.RAMOutputStream

这是OutputStream的一个子类,其输出设备是内存,准确来说是RAMFile,即将数据写入到RAMFile的Vector中去。
该类有一个最重要的方法,现在把它整个贴出来

public void flushBuffer(byte[] src, int len) {
    int bufferNumber = pointer/BUFFER_SIZE;   //buffer序列,即当前所写Buffer在RAMFile中的Vector中的序列号
    int bufferOffset = pointer%BUFFER_SIZE;   //偏移量,即当前所写字节在当前Buffer中的偏移量。
    int bytesInBuffer = BUFFER_SIZE - bufferOffset; //当前Buffer的剩余可写字节数
   //bytesToCopy是实际写入的字节数,如果当前Bufer的剩余字节数大于需要写的字节的总数则写入所有字节
   //否则,将当前Buffer写满即可,剩余的字节将写入下一个Buffer
    int bytesToCopy = bytesInBuffer >= len ? len : bytesInBuffer;

    if (bufferNumber == file.buffers.size())
      file.buffers.addElement(new byte[BUFFER_SIZE]); //在RAMFile中添加新的byte[1024]元素

    byte[] buffer = (byte[])file.buffers.elementAt(bufferNumber);
    System.arraycopy(src, 0, buffer, bufferOffset, bytesToCopy);

    if (bytesToCopy < len) {     // not all in one buffer,
      int srcOffset = bytesToCopy;
      bytesToCopy = len - bytesToCopy;    // remaining bytes 剩余的未写入的字节数
      bufferNumber++;                         //将buffer数增加1
      if (bufferNumber == file.buffers.size()) 
        file.buffers.addElement(new byte[BUFFER_SIZE]);
      buffer = (byte[])file.buffers.elementAt(bufferNumber); //剩余字节写入下一个Buffer
      System.arraycopy(src, srcOffset, buffer, 0, bytesToCopy);
    }
    pointer += len;
    if (pointer > file.length)
      file.length = pointer;        //移位文件指针          在原有的基础上加上实际写入的字节总数

    file.lastModified = System.currentTimeMillis(); //修改文件的最后修改时间为当前时间
  }

从指定的字节数组复制指定长度的字节到RAMFile中去。由于RAMFile中Vector的元素是byte[1024]所以可能存在做一次该操作
要操作两个Vector元素的情况。即先将当前byte[1024]数组填满,再新建一个元素装载剩余的字节。

另外还有一个writeTo(OutputStream out)方法,将RAMFile中的数据输出到另一个输出流



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


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


网站导航: