• 实时读取日志文件


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

    参考: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:记录行号 

        --如果用循环读取方法,循环会消耗资源,使系统负担太重

  • 相关阅读:
    函数的存储 堆和栈
    函数的容错处理 函数的返回值
    Linux启动故障排查和修复技巧
    干货 | 亿级Web系统负载均衡几种实现方式
    利用expect批量修改Linux服务器密码
    干货 | LVM快照学习
    实战 | Linux根分区扩容
    LVM 逻辑卷学习
    Shell脚本实战:日志关键字监控+自动告警
    手把手教你在Linux中快速检测端口的 3 个小技巧
  • 原文地址:https://www.cnblogs.com/zhxuxu/p/9745730.html
Copyright © 2020-2023  润新知