• 实时读取日志文件


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

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

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

  • 相关阅读:
    【Spring】 AOP Base
    【Offer】[20] 【表示数值的字符串】
    【Offer】[19] 【字符串匹配】
    【设计模式】代理模式
    【LeetCode】[0002] 【两数之和】
    【Offer】[18-1] 【在O(1)时间内删除链表节点】
    【Offer】[18-2] 【删除链表中重复的节点】
    【Offer】[17] 【打印1到最大的n位数】
    【Offer】[16] 【数值的整数次方】
    python_内置函数
  • 原文地址:https://www.cnblogs.com/zhxuxu/p/9745730.html
Copyright © 2020-2023  润新知