我有一个包含gzip压缩日志文件的目录,每行一个事件.为了实时读取和处理这些,我创建了一个与此处列出的代码相同的WatcherService:http://docs.oracle.com/javase/tutorial/essential/io/notification.html
在processEvents()方法中,我添加了此代码以逐行读取已添加或追加的文件:
if (kind == ENTRY_MODIFY) { try(BufferedReader reader = new BufferedReader(new InputStreamReader(new GZIPInputStream(Files.newInputStream(child, StandardOpenOption.READ))))) { String line; while ((line = reader.readLine()) != null) { System.out.println(line); } } catch(EOFException ex) { //file is empty, so ignore until next signal } catch(Exception ex) { ex.printStackTrace(); } }
现在,正如您可以想象的那样,这对于在几毫秒内创建的已编写和关闭的文件非常有用,但是,当处理随时间附加的大文件时,这将为每个附加行反复读取整个文件(给定生成器现在然后刷新和同步文件).
有没有什么办法可以在每次发送ENTRY_MODIFY信号时只读取此文件中的新行,或者找出文件"完成"的时间?
如何处理未附加但被覆盖的文件?