java检测文件修改_监视Java中的文件和目录更改

我在这里写的主要是关于从哪里开始的建议。我已经实现了一个类,该类将使用Java的WatchService递归监视目录。它可以很好地检测更改,但是我注意到了一个致命的缺陷:我无法删除包含正在监视的目录的正在监视的目录。这似乎是WatchService的限制。

我还稍微研究了Apache的VFS FileListener,但是在花了大约6个小时的时间来围绕它构建某种包装之前,我想也许我只是问那些比我知识渊博的人。

我需要被监视的目录是完全可操作的,但被监视的根目录不会被删除或重命名。我已经可以使用一个不错的类来监视不会锁定文件或文件夹的文件和目录吗?我试图避免使用轮询/哈希比较方法,但是我越来越觉得我将需要使用该方法并消耗大量的CPU资源。我从哪里开始呢?理想情况下,我需要:

-检测文件和目录的创建-检测文件和目录的删除-检测文件和目录的重命名-检测文件的修改-检测文件在目录之间的移动

我还看到有人认为观察者不可靠,并且他们将两者结合使用(以防观察者在某处发生故障时偶尔进行轮询),但是听起来像是一种真正的痛苦,我宁愿避免,如果不是这样的话无论如何,最好的方法。我有一种感觉,我需要轮询和散列,特别是因为我想检测文件的移动和重命名,但是请告诉我是否存在更好的选项。

在此先感谢您,并为非特定于代码的问题感到抱歉!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以使用Java的WatchService API来监视目录文件变化,以便在文件复制完成时得到通知。具体来说,你可以使用以下步骤: 1. 创建一个WatchService对象来监视目录文件变化: ``` WatchService watchService = FileSystems.getDefault().newWatchService(); Path directory = Paths.get("path/to/directory"); directory.register(watchService, StandardWatchEventKinds.ENTRY_CREATE); ``` 2. 启动一个线程来处理WatchService事件: ``` Thread thread = new Thread(() -> { while (true) { WatchKey key; try { key = watchService.take(); } catch (InterruptedException e) { return; } for (WatchEvent<?> event : key.pollEvents()) { if (event.kind() == StandardWatchEventKinds.ENTRY_CREATE) { Path createdFile = (Path) event.context(); // 在这里判断文件是否复制完成 } } key.reset(); } }); thread.start(); ``` 3. 在处理WatchService事件的线程判断新创建的文件是否复制完成。你可以使用Java的File.lastModified()方法来获取文件的最后修改时间,并在一段时间内检查该时间是否发生变化。如果文件的最后修改时间在一段时间内没有变化,那么可以认为文件复制完成了。 ``` long lastModified = 0; while (true) { try { long currentModified = Files.getLastModifiedTime(createdFile).toMillis(); if (lastModified == currentModified) { // 文件复制完成 break; } lastModified = currentModified; } catch (IOException e) { // 处理异常 } try { Thread.sleep(1000); // 等待一秒钟 } catch (InterruptedException e) { return; } } ``` 注意,这种方法只能判断文件是否复制完成,但不能保证文件内容的完整性。所以,在使用复制完成的文件之前,还需要进行一些其他的检查,例如文件大小是否正确,文件格式是否正确等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值