實時讀取日志文件


需求:在生成日志文件的過程中,需要實時讀取該日志,需要每次讀取時記錄一次讀取的位置,下一次從該位置讀取

參考: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:記錄行號 

    --如果用循環讀取方法,循環會消耗資源,使系統負擔太重


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM