Lucene写文件数据小技巧

87 阅读2分钟

公众号:冒泡的肥皂

分享最近看Lucene学到的小技巧

文件写入操作时,如何判断写文件的边界:

  • 文件大小限制:根据系统或业务需求,设定文件的最大大小。当文件接近或达到该大小时,停止写入或切换到新文件。
  • 内容分隔符:通过特定的分隔符(如换行符、标签等)来标记数据的边界,确保每次写入的内容完整且不重叠。
  • 时间间隔:按时间维度划分文件边界,例如每小时或每天生成一个新文件。
  • 数据批次:根据写入的数据批次或记录数,设定边界条件,例如每写入1000条记录后切换文件。
  • 文件系统限制:考虑文件系统对文件名长度、路径深度或单个文件大小的限制,避免超出这些限制。

Lucene采用的方法

  • 内容长度+内容+校验码:来区分单个独有的内容
  • 内容长度如何控制:固定长度位数;动态长度位数?lucene采用的是动态的位数
  • 校验码:不知道平时用不?例如数据库中的重要数据防止篡改如何控制?(代码对重要数据字段加验签了,方法自己搞了)。
  • lucene用了系统自带的一个类(Checksum)用了这么久JAVA第一次看这个类

Lucene中动态长度控制的读写

大概逻辑:

  • 如果第八位作为标志位,如果是0则代表计数结束。
  • 如果第八位是1的话,则向前进一个字节
  • 00000000 11000000 转换为
  • 00000001 01000000
//读取
 public int readVInt() throws IOException {
    byte b = readByte();
    int i = b & 0x7F;
    for (int shift = 7; (b & 0x80) != 0; shift += 7) {
      b = readByte();
      i |= (b & 0x7F) << shift;
    }
    return i;
  }
//写入
public void writeVInt(int i) throws IOException {
    while ((i & ~0x7F) != 0) {
      writeByte((byte)((i & 0x7f) | 0x80));
      i >>>= 7;
    }
    writeByte((byte)i);
  }

Lucene中对数据校验采用的方法

  • 上面说了用了系统自带的一个类(Checksum
  • 在包装了字节写入的时候实时的对数据生成校验码
 public void writeByte(byte b) throws IOException {
    //校验码
    digest.update(b);
    main.writeByte(b);
  }

Lucene如何把Map数据写入文件的

  • size(长度):(长度key:长度:value)
  • 当然前提是数据结构自己知道了