1. 程式人生 > >實時讀取日誌文件

實時讀取日誌文件

class nts microsoft nal char 耗資源 連接 生成 轉換

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

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

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

實時讀取日誌文件