博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
实时读取日志文件
阅读量:4658 次
发布时间:2019-06-09

本文共 2552 字,大约阅读时间需要 8 分钟。

需求:在生成日志文件的过程中,需要实时读取该日志,需要每次读取时记录一次读取的位置,下一次从该位置读取

参考: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

你可能感兴趣的文章
SqlServer 垂直分表
查看>>
BZOJ 1677: [Usaco2005 Jan]Sumsets 求和
查看>>
缓冲流
查看>>
DIV不用图片做可变可到处用的圆角
查看>>
luogu3899谈笑风生
查看>>
博客推荐
查看>>
MyBatis-Spring配置简单了解
查看>>
汇编语言 Part 1——简介、基本语法、内存分段与内存地址
查看>>
java创建线程的三种方式及其对照
查看>>
unity常见问题之20题
查看>>
AI类第四周进度
查看>>
SQLServer学习笔记系列7
查看>>
【bzoj1712】[Usaco2007 China]Summing Sums 加密 矩阵乘法
查看>>
如何解决git创建密匙时报错Too many arguments
查看>>
python学习笔记-25 实例属性和类属性
查看>>
python 单例模式
查看>>
Java知识积累——String引用的判断问题
查看>>
Asp.Net Web API 2第七课——Web API异常处理
查看>>
bzoj 2339: [HNOI2011]卡农
查看>>
15-浮动
查看>>