如何监视文件中的新内容并检索该内容

2023-11-30

我有一个名为foo.txt。该文件包含一些文本。我想实现以下功能:

  1. 我启动程序
  2. 向文件写入一些内容(例如添加一行:new string in foo.txt)
  3. 我只想获取该文件的新内容。

您能阐明这个问题的最佳解决方案吗?我还想解决相关问题:如果我修改foo.txt我想看看差异。

我在 Java 中找到的最接近的工具是WatchService但如果我理解正确的话,这个工具只能检测文件系统上发生的事件类型(创建文件或删除或修改)。


Java 差异实用程序就是为此目的而设计的。

final List<String> originalFileContents = new ArrayList<String>();
final String filePath = "C:/Users/BackSlash/Desktop/asd.txt";

FileListener fileListener = new FileListener() {

    @Override
    public void fileDeleted(FileChangeEvent paramFileChangeEvent)
    throws Exception {
        // use this to handle file deletion event

    }

    @Override
    public void fileCreated(FileChangeEvent paramFileChangeEvent)
    throws Exception {
        // use this to handle file creation event

    }

    @Override
    public void fileChanged(FileChangeEvent paramFileChangeEvent)
    throws Exception {
        System.out.println("File Changed");
        //get new contents
        List<String> newFileContents = new ArrayList<String> ();
        getFileContents(filePath, newFileContents);
        //get the diff between the two files
        Patch patch = DiffUtils.diff(originalFileContents, newFileContents);
        //get single changes in a list
        List<Delta> deltas = patch.getDeltas();
        //print the changes
        for (Delta delta : deltas) {
            System.out.println(delta);
        }
    }
};

DefaultFileMonitor monitor = new DefaultFileMonitor(fileListener);
try {
    FileObject fileObject = VFS.getManager().resolveFile(filePath);
    getFileContents(filePath, originalFileContents);
    monitor.addFile(fileObject);
    monitor.start();
} catch (InterruptedException ex) {
    ex.printStackTrace();
} catch (FileNotFoundException e) {
    //handle
    e.printStackTrace();
} catch (IOException e) {
    //handle
    e.printStackTrace();
}

Where getFileContents is :

void getFileContents(String path, List<String> contents) throws FileNotFoundException, IOException {
    contents.clear();
    BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(path), "UTF-8"));
    String line = null;
    while ((line = reader.readLine()) != null) {
        contents.add(line);
    }
}

我做了什么:

  1. 我将原始文件内容加载到List<String>.
  2. I used Apache 共享 VFS监听文件更改,使用FileMonitor。你可能会问,why?因为WatchService仅从 Java 7 开始可用,而FileMonitor至少适用于 Java 5(个人喜好,如果您愿意的话)WatchService你可以使用它)。note:Apache Commons VFS 依赖Apache 公共日志记录,您必须将两者添加到构建路径中才能使其正常工作。
  3. 我创建了一个FileListener,然后我实现了fileChanged method.
  4. 该方法从文件中加载新内容,并使用Patch.diff检索所有差异,然后打印它们
  5. 我创建了一个DefaultFileMonitor,它基本上监听文件的更改,然后我将我的文件添加到其中。
  6. 我启动了监视器。

监视器启动后,它将开始监听文件更改。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何监视文件中的新内容并检索该内容 的相关文章

  • 不支持的字段:将瞬间格式化为日期 ISO 时的年份[重复]

    这个问题在这里已经有答案了 我正在尝试将 Instant 格式化为 ldap 日期 ISO8601 但在 f format Instant now 处失败 String input 20161012235959 0Z DateTimeFor
  • 将处理项目移至 Eclipse

    我已经在处理项目上工作了一段时间 现在想将其移至 Eclipse 中 我已经在 Eclipse 环境中安装了 Proclipse 我有很多扩展名为 pde 的文件 然而 Proclipse 文件都以 java 结尾 所有 pde 文件都存在
  • 了解 netty 通道缓冲区和水印

    我正在尝试了解网络缓冲区和水印 作为一个测试用例 我有一个 netty 服务器 它向客户端写入数据 客户端被阻止 基本上每次读取之间有 10 秒的睡眠时间 在正常 I O 下 如果接收方被阻塞 TCP 发送方将受到限制 由于流量控制 发送速
  • 垂直 ViewPager 中的动画

    我需要垂直制作这个动画ViewPager https www youtube com watch v wuE 4jjnp3g https www youtube com watch v wuE 4jjnp3g 这是我到目前为止所尝试的 vi
  • 如何准确判断 double 是否为整数? [复制]

    这个问题在这里已经有答案了 具体来说 在 Java 中 我如何确定double是一个整数 为了澄清 我想知道如何确定 double 实际上不包含任何分数或小数 我主要关心的是浮点数的性质 我想到的方法 以及我通过谷歌找到的方法 基本上遵循以
  • 在 Eclipse 3.5 上安装旧版 TestNG 插件时出现问题

    我正在尝试在 eclipse 3 5 上安装 TestNG 5 11 并获得以下信息 eclipse buildId unknown java version 1 6 0 19 java vendor Sun Microsystems In
  • Selenium 和 TestNG 同时使用“dependsOn”和“priority =”问题

    我正在努力在 GUI 自动化测试中实现更好的工作流程控制 我首先从dependsOn开始 但很快发现缺点是如果一个测试失败 则套件的整个其余部分都不会运行 所以我改用 priority 但看到了意外的行为 一个例子 Test priorit
  • Maven WebApp META-INF context.xml

    我正在使用 Maven 3 并且尝试在 webapp 文件夹下添加 META INF 文件夹 所以我正在尝试执行以下操作 src main webapp META INF context xml WEB INF 下面是我的 POM 文件
  • 使用 kryo 注册课程的策略

    我最近发现了 kryonet 库 它非常棒并且非常适合我的需求 然而 我遇到的一个问题是制定一种好的策略来注册所有可以转移的类 我知道我可以在每个对象中编写一个静态方法 该方法将返回它使用的所有类的列表 但我真的不想这样做 为了我自己的时间
  • 如何在 Eclipse 中获得完全限定的类名?

    有没有一种快速方法可以在 Eclipse 中单击 Java 类并获取其完全限定名称 或将其复制到剪贴板 2016年6月29日编辑 正如 Jeff 所指出的 您只需要执行以下第二步 1 Double click on the class na
  • 膨胀类 android.support.design.widget.NavigationView 时出错

    我按照 NavigationView 的教程进行操作 但无法解决此错误消息 Error inflating class android support design widget NavigationView 教程链接 https www
  • JERSEY:错误跟踪:java.lang.IllegalStateException:实体输入流已关闭

    我正在使用 Jersey 2 x 以下是我的控制器 GET Path id Produces application json public Response getUser PathParam id int userId Context
  • 在Java中如何将字节数组转换为十六进制?

    我有一个字节数组 我希望该数组的每个字节字符串转换为其相应的十六进制值 Java中有没有将字节数组转换为十六进制的函数 byte bytes 1 0 1 2 3 StringBuilder sb new StringBuilder for
  • java中如何重新初始化int数组

    class PassingRefByVal static void Change int pArray pArray 0 888 This change affects the original element pArray new int
  • 了解Kafka流groupBy和window

    我无法理解 kafka 流中的 groupBy groupById 和窗口的概念 我的目标是聚合一段时间内 例如 5 秒 的流数据 我的流数据看起来像 value 0 time 1533875665509 value 10 time 153
  • 从字节数组设置 img src

    我需要设置img src我在对象中拥有的字节数组的属性 img
  • Firebase:用户注册后如何进行电话号码验证?

    所以我知道我可以使用电子邮件验证或电话号码验证 但我想做的是在用户注册或登录后进行电话号码验证 如何连接这两种身份验证方法 最后 Firebase中是否有一个函数可以检查用户是否通过电话号码验证 谢谢 即使用户已通过身份验证 您仍然可以使用
  • Java时区混乱

    我正在运行 Tomcat 应用程序 并且需要显示一些时间值 不幸的是 时间快到了 还有一个小时的休息时间 我调查了一下 发现我的默认时区被设置为 sun util calendar ZoneInfo id GMT 08 00 offset
  • com.sun.xml.ws.message.saaj.SAAJHeader 无法转换为 com.sun.xml.ws.security.opt.impl.outgoing.SecurityHeader

    我正在尝试访问第三方 Web 服务 该服务要求我创建一个传递时间信息 用户名和密码的安全标头 我在网上搜索了可行的示例 并尝试了多种方法 我正在尝试使用 Java 6 中内置的内容来做到这一点 我不确定我做错了什么 从 WSDL 生成 We
  • 如何在J2ME中获取数字的幂[重复]

    这个问题在这里已经有答案了 可能的重复 J2ME power double double 数学函数实现 https stackoverflow com questions 2076913 j2me powerdouble double ma

随机推荐

  • POSIX 正则表达式不适用于 [:digit:] 字符类

    我在日志文件中有以下日志行access 20170118 14 log 127 0 0 1 18 Jan 2017 14 22 16 0000 GET fam shared generate test devicelist php HTTP
  • Delphi:为什么断点有时不可用(IDE 上的绿色突出显示线)?

    有时我会失去 Delphi 中的断点功能 我认为这是 Delphi 2009 的问题 但现在我在 Delphi XE 中也有它 在 Delphi 2009 中 通过删除 dproj 文件 我使断点再次起作用 在 Delphi XE 中 我无
  • 不允许销毁资产以避免数据丢失

    我的RemoveTail 函数执行以下代码时遇到了麻烦 destroy gameObject 这个蛇游戏创建了我的蛇预制件的克隆 我通过分配 尾巴 来控制蛇的长度 并在达到 maxSize 时删除 尾巴 游戏对象 我知道我的错误是由于游戏删
  • ImageMagick 将 jpg 图像转换为 gif 速度慢

    我正在使用Magick IM 7 0 3平台 CentOS Linux版本7 0 将图像转换为gif 我从文件创建 Image 对象 问题是当我将 9 个 png 文件 每个 50kb 转换为 gif 时 只需要 50ms 但当变成9个jp
  • 类别重叠分析

    我正在尝试执行一些类别重叠分析并需要帮助 我有由客户服务票组成的数据 门票上标有类别数据 票证可以包含多个类别标签 我有一个提取票证 ID 和类别的查询 我得到多行包含多个类别的 ID 我正在寻找一种显示类别重叠的方法 例如 有多少票有类别
  • 获取当前地址位置的最佳方式 Kotlin 2023

    我想创建一个当前位置按钮来获取用户的当前地址 目前我正在使用fusedLocationClient lastLocation但它很慢 有时甚至不起作用 2023 年是否有更好且更新的方法使用 Kotlin 从用户处获取当前地址 祝你今天过得
  • 是否可以将可滚动的 TextView 添加到 ListView 中?

    我有一个 ListView 其中每行都有固定的高度 每行在一些图像旁边都包含一个 TextView 有时 我想要显示的文本太大 因此我想使其可滚动 所以我添加了 基于使 TextView 在 Android 上可滚动 将以下行添加到我的 T
  • 如何从 Promise 中提取数据

    我有一个返回数据的承诺 我想将其保存在变量中 由于异步性质 这在 JavaScript 中是不可能的吗 我需要使用吗onResolve作为回调 我可以以某种方式使用它 例如用 async await 包装它 const foo bar Pr
  • 多层评论回复:显示和存储

    因此 我正在尝试创建一个评论系统 您可以在其中回复已经回复的评论 允许您创建理论上无限的回复线程 我希望它们按时间顺序显示 最新的在顶部 但回复当然应该直接位于原始评论的下方 如果有多个评论回复同一条评论 回复也应按时间顺序排列 仍在原始评
  • AngularUI 日期选择器允许输入超出范围的值

    我遇到一个问题 我使用 AngularUI 指定具有一些允许的输入值范围的日期选择器 例如 用户可以选择从2013年6月10日到2013年6月20日的日期 只要用户在日期选择器内单击 这种方法就可以正常工作 但当用户键入范围之外的日期时 这
  • 如何在 C++ 中初始化“静态常量”数据成员?

    是否可以初始化一个static const构造函数之外的数据成员 它可以在声明数据成员的同一位置进行初始化吗 class A private static const int a 4 是的 你可以 但仅限于 int 类型 如果您希望静态成员
  • Oracle加载java JSch

    我想知道是否使用loadjava加载名为的 Java 包JSch jar在 Oracle 数据库中 然后加载另一个 java 文件 该文件利用 JSch 包通过 SSH 连接 将能够通过函数或过程在 Oracle 数据库中执行 我在尝试之前
  • 通过 require("http") 请求将图像作为二进制发送到远程服务器

    我正在尝试从 Node js 服务器将图像发送到远程服务器 这是到目前为止的请求格式 Note 就像邮递员中的二进制请求并选择文件并发送一样 function upload options body body body return new
  • 可以传递给 SQL*Plus 的命令行参数的最大长度?

    我从 Linux C Shell 调用 SQL Plus sqlplus username password file sql var1 var2 var3 如果我将字符串传递为var1 这个字符串可以有多长 它受操作系统控制吗 在这种情况
  • < > 在类接口中代表什么意思?

    我确信我在某处读过这篇文章 谁能告诉我以下界面中的 代表什么 interface GameFinder NSObject
  • “|”是什么for 在 Haskell 类定义中?

    我无法弄清楚 m gt w 部分在这样的类定义中意味着什么 class Monoid w Monad m gt MonadWriter w m m gt w 这会向类定义添加哪些附加信息 竖线是语法分隔符 本身没有任何意义 用于引入函数依赖
  • SQLite3中的窗口函数

    以下 Oracle SQL select 允许我选择表中的所有行重复的根据某些领域 例如 它们具有相同的COLUMN 1 COLUMN 2 and COLUMN 3 SELECT FROM SELECT t ROW NUMBER OVER
  • 获取scheme中List的中间元素

    我是计划的新手 有人可以给我关于如何获取 列表中的中间元素 的想法吗 这是我的解决方案 它基于一个龟兔赛跑算法 它用于任何需要检测循环列表的列表遍历 因此它不会比正常的列表遍历做更多的工作 define middle elements ls
  • try-catch-finally 错误

    我遇到了问题 最终完成了尝试捕获 我完成了一切正常 直到捕获 我的代码错误都说 预期的 catch 语法错误 我已经进行了谷歌搜索 但没有找到有效的东西 我已附上我的代码 这只是一个放置错误 还是我没有抛出正确类型的错误 提前致谢 publ
  • 如何监视文件中的新内容并检索该内容

    我有一个名为foo txt 该文件包含一些文本 我想实现以下功能 我启动程序 向文件写入一些内容 例如添加一行 new string in foo txt 我只想获取该文件的新内容 您能阐明这个问题的最佳解决方案吗 我还想解决相关问题 如果