需求:在生成日志文件的过程中,需要实时读取该日志,需要每次读取时记录一次读取的位置,下一次从该位置读取
参考:http://sunnylocus.iteye.com/blog/694666
问题:由于我是每次读取几十行日志就停止一次,如果使用上面连接的代码RandomAccessFile.length()记录文件位置,发现记录的位置远大于读取的位置,这样为导致丢失一部分信息
方法1:因为日志是一直在写,一开始从0开始,可以先记录一下当前读取位置的的指针,下一次开始读的时候从该处再次读取
方法1需要用到以下内容:
randomAccessFile.getFilePointer()
此方法返回从文件开始的偏移量,以字节为单位,当前位置的偏移量
randomAccessFile.readLine()
方法从这个文件读取文本的下一行。该方法依次从文件中读取的字节处开始,从当前文件指针,直到它到达一个行结束或在文件的结尾。每个字节是通过采取字节的值的低8位的字符,并设置高8位字符的零转换成一个字符。
RandomAccessFile.seek()
偏移位置,以字节为单位从文件的开头计量,在其上设置文件指针。
RandomAccessFile.length()
此方法返回当前文件的长度,以字节为单位。
File logFile = new File("D:\\workspace\\drawChart\\src\\read_log\\log.txt");
private long lastTimeFileSize = 0; // 上次文件大小
protected void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException{ //获取保存的上一次读取的位置 String str = request.getParameter("lastTimeFileSize"); lastTimeFileSize = Long.parseLong(str); System.out.println(lastTimeFileSize); try { long len = logFile.length(); System.out.println(len); if(lastTimeFileSize >= len){ lastTimeFileSize = len; try { //如果读取的速度超过写的速度,等待5秒 Thread.sleep(5000); } catch (InterruptedException e1) { e1.printStackTrace(); } }else{ RandomAccessFile randomFile = new RandomAccessFile(logFile, "r"); randomFile.seek(lastTimeFileSize); String tmp = null; while ((tmp = randomFile.readLine()) != null) { if(matcher0.lookingAt()){ if(flag==4){ //记录读取文件的位置 lastTimeFileSize = randomFile.getFilePointer(); System.out.println(lastTimeFileSize); //保存指针 } } } catch (IOException e) { e.printStackTrace(); }finally{ //其它操作 } }
方法2:记录行号
--如果用循环读取方法,循环会消耗资源,使系统负担太重
原文地址:https://www.cnblogs.com/zhxuxu/p/9745730.html