使用hutool工具包Tailer类监听文件内容时,如果文件忽然被清空后在重新写入,此时无法监听到文件第一行数据

解决方法:

复写cn.hutool.core.io.file包下LineReadWatcher类

package cn.hutool.core.io.file;import cn.hutool.core.io.FileUtil;
import cn.hutool.core.io.IORuntimeException;
import cn.hutool.core.io.LineHandler;
import cn.hutool.core.io.watch.SimpleWatcher;import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.charset.Charset;
import java.nio.file.Path;
import java.nio.file.WatchEvent;/*** 此类用于覆盖第三方调用类,不允许更改该类的包路径!!!* 不会直接调用* 行处理的Watcher实现* * @author looly* @since 4.5.2*/
public class LineReadWatcher extends SimpleWatcher implements Runnable {private final RandomAccessFile randomAccessFile;private final Charset charset;private final LineHandler lineHandler;/*** 构造* * @param randomAccessFile {@link RandomAccessFile}* @param charset 编码* @param lineHandler 行处理器{@link LineHandler}实现*/public LineReadWatcher(RandomAccessFile randomAccessFile, Charset charset, LineHandler lineHandler) {this.randomAccessFile = randomAccessFile;this.charset = charset;this.lineHandler = lineHandler;}@Overridepublic void run() {onModify(null, null);}@Overridepublic void onModify(WatchEvent<?> event, Path currentPath) {final RandomAccessFile randomAccessFile = this.randomAccessFile;final Charset charset = this.charset;final LineHandler lineHandler = this.lineHandler;try {final long currentLength = randomAccessFile.length();final long position = randomAccessFile.getFilePointer();if (position == currentLength) {// 内容长度不变时忽略此次事件return;} else if (currentLength < position) {// 如果内容变短,说明文件做了删改,回到内容末尾randomAccessFile.seek(currentLength);return;}// 读取行FileUtil.readLines(randomAccessFile, charset, lineHandler);// 记录当前读到的位置randomAccessFile.seek(currentLength);} catch (IOException e) {throw new IORuntimeException(e);}}
}

自己记录的一些笔记,内容如有不对请指正

hutool工具包Tailer类监听文件的bug相关推荐

  1. Java 使用Tailer类监听文件

    线程创建的三种方式:   FileDataListener listener = new FileDataListener(path,this);         //使用单线程池线程监听文件     ...

  2. Android 中关于 FileObserver类监听文件状态的实践

    文章目录 需求背景 走进源码 实现示例 参考 需求背景 当某一个目录的文件发生变化(创建.修改.删除.移动)时,需要给一个回调事件给其他端调用. 其他场景:阅后即焚等等. 比如在 Android 的 ...

  3. C# FileSystemWatcher监听文件夹

    用FileSystemWatcher监听文件夹 很久没有写windows服务了,这两天做了一个监听文件夹的服务,用FileSystemWatcher类监听文件夹,如果有新创建的xml文件,就把xml文 ...

  4. Hutool操作和监听文件

    目录 1 文件监听简单使用 1.1 WatchMonitor 1.2 内部应用 1.3 监听指定事件 1.4 监听全部事件 1.5 延迟处理监听事件 2 文件的读取 3 文件的写入 4 文件追加 5 ...

  5. java实现监听文件

    监听文件是否添加 当前项目需要读取日志信息,向监听日志更新的动态. 用线程的方式来监控log日志文件 我们首先要了解以下这三个类 1.Tailer类 Tailer类的主要作用是采用线程的方式去监控日志 ...

  6. java 接口文件夹_Java NIO.2 使用Path接口来监听文件、文件夹变化

    Java7对NIO进行了大的改进,新增了许多功能: •对文件系统的访问提供了全面的支持 •提供了基于异步Channel的IO 这些新增的IO功能简称为 NIO.2,依然在java.nio包下. 早期的 ...

  7. 监听文件变化并自动运行 npm script

    监听文件变化并自动运行 npm script 软件工程师做的事情基本都是在实现自动化,比如各种业务系统是为了业务运转的自动化,部署系统是为了运维的自动化,对于开发者本身,自动化也是提升效率的关键环节, ...

  8. woo如何监听目录和文件变动,woo目录中的文件被改变,监听文件被修改权限

    记录下woo语言监听文件和和文件夹变动后触发事件 非常完整的例子了. 注意由于文件监听属于工具类,则需要使用wop而不是woo print('file notify')-- 初始化监听实列 local ...

  9. Java实现监听文件变化的三种方法,推荐第三种

    背景 在研究规则引擎时,如果规则以文件的形式存储,那么就需要监听指定的目录或文件来感知规则是否变化,进而进行加载.当然,在其他业务场景下,比如想实现配置文件的动态加载.日志文件的监听.FTP文件变动监 ...

最新文章

  1. 不同分类算法的优缺点是什么?(值得推荐)
  2. Spring事务之Propagation
  3. 10、MySQL常用运算符概述
  4. SQLite大批量插入性能优化
  5. fan怎么写 jin_拼音为fan的字
  6. 服务器系统核心和带gui区别,Windows Server 2012图形用户界面(GUI)和服务器核心(Server Core)之间的切换...
  7. Oracle J.D.Edwards技术与应用
  8. TSOJ--2018 江苏省省赛
  9. java redis3.0_Java + Redis(第三章)
  10. 中国石油大学计算机专业调剂信息,中国石油大学(北京)地球科学学院2020级硕士研究生招生缺额信息发布公告...
  11. 项目经理应该具备的四种能力
  12. python针对Excel表格的操作
  13. 如何将多张图片转换为pdf格式
  14. 黑苹果Mac系统快捷键修改
  15. FAST-LIO,FAST-LIO2与FASTER-LIO
  16. 阿里云OSS 图片处理
  17. Android 全埋点方案盘点
  18. 台湾清华大学计算机网络--001
  19. nas存储服务器操作系统,你会用 NAS 给 PC 装系统吗?
  20. 调试本地SQLServer存储过程

热门文章

  1. Direct3D初始化
  2. ISO Country Code - 标准国家码
  3. 数据思索和应用一 :什么是数据
  4. 打造私域流量,外卖小程序是最好的选择
  5. 游戏王生命值计算机,游戏王        直接扣生命值的卡有什么啊
  6. 2022百度收录批量自动推送助手
  7. Linux系统编程:树莓派 ds18b20温度获取(文件IO相关操作)
  8. u盘运行的linux系统软件,大师练习xp系统利用U盘直接运行Linux软件 的设置教程...
  9. ChatGPT使用详细步骤
  10. LiteCAD参考文档的学习二(命令接口,命名对象之块、块的引用、块的属性、命令接口块的插入、块的复制)