code: private void readTail() throws IOException {
  		final long len = this.randomAccessFile.length();
  
  		if (initReadLine > 0) {
  			long start = this.randomAccessFile.getFilePointer();
  			long nextEnd = len - 1;
  			this.randomAccessFile.seek(nextEnd);
  			int c;
  			int currentLine = 0;
  			while (nextEnd > start) {
  				// 满
  				if (currentLine > initReadLine) {
  					break;
  				}
  				c = this.randomAccessFile.read();
  				if (c == CharUtil.LF || c == CharUtil.CR) {
  					FileUtil.readLine(this.randomAccessFile, this.charset, this.lineHandler);
  					currentLine++;
  					nextEnd--;
  				}
  				nextEnd--;
  				this.randomAccessFile.seek(nextEnd);
  				if (nextEnd == 0) {
  					// 当文件指针退至文件开始处，输出第一行
  					FileUtil.readLine(this.randomAccessFile, this.charset, this.lineHandler);
  					break;
  				}
  			}
  		}
  
  		// 将指针置于末尾
  		try {
  			this.randomAccessFile.seek(len);
  		} catch (IOException e) {
  			throw new IORuntimeException(e);
  		}
  	}
docs: 预读取行
  
  @throws IOException