public StoreTxLog(
      StoreConfig storeConfig, File file, boolean readonly, boolean isNewFile, long firstRecordId)
      throws IOException {
    this.storeConfig = storeConfig;
    this.entryBuffer = ByteBuffer.allocate(storeConfig.getMaxxLogEntryLength() + 1 + 4);
    this.fileHeader = new StoreTxLogFileHeader();

    if (!readonly) {
      syncTimer = new Timer("ltsdb-dblog-sync-timer", true);

      syncCallable =
          new FutureTimerTask.Callable() {
            @Override
            public void call() throws Exception {
              checkPoint();
            }
          };
    }

    if (isNewFile && file.exists()) {
      throw new IOException(file + " exists already");
    } else {
      FileUtils.createFileIfNotExist(file);
    }

    fileChannel = FileUtils.newFileChannel(file, "rw");

    if (isNewFile) {
      // 新文件长度为头部长度
      fileLength = fileHeader.getLength();
      fileHeader.setFirstRecordId(firstRecordId);

      fileHeader.write(fileChannel);
    } else {
      fileHeader.read(fileChannel);
      fileLength = fileChannel.size();
      lastCheckPointLength = fileLength;
    }
  }
 public long getFirstRecordId() {
   return fileHeader.getFirstRecordId();
 }
 public int getHeaderLength() {
   return fileHeader.getLength();
 }
 public long getNextRecordId() {
   return fileHeader.getFirstRecordId() + fileLength;
 }