實時讀取日誌文件
阿新 • • 發佈:2018-10-06
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:記錄行號
--如果用循環讀取方法,循環會消耗資源,使系統負擔太重
實時讀取日誌文件