问题标签 [watchservice]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
315 浏览

java - Watchservice 没有被触发

我正在编写一个应用程序,在该应用程序中,我使用 WatchService(http://docs.oracle.com/javase/7/docs/api/java/nio/file/WatchService.html )监视来自外部程序的日志文件)。每当在文件上触发 EVENT_MODIFIED 时,我都会读取它并检查是否存在某个字符串。当我手动输入文本并保存文件时,我的程序工作正常,但是当外部程序编辑日志文件时,不会触发 WatchService。

我尝试了一种不同的方法,我使用一个线程读取文件并休眠一段时间,然后重复。这可以解决问题,但我宁愿不要每隔 X 秒轮询一次文件,因为应该可以“监听”更改。

有谁知道为什么 WatchServices 没有检测到这些修改?

0 投票
1 回答
2091 浏览

java - 在 WatchService 中,key.pollEvents() 和 key.reset() 之间发生了什么?

看看这个Java 示例,关于关键状态,Oracle 说:

Ready表示密钥已准备好接受事件。首次创建时,密钥处于就绪状态。

Signaled表示一个或多个事件已排队。一旦密钥发出信号,它就不再处于就绪状态,直到调用重置方法。

WatchKeyjavadoc 中:

在密钥处于信号状态时检测到的事件会排队,但不会导致密钥重新排队以从监视服务中检索

文档没有说明key.pollEvents()和之间生成的事件会发生什么key.reset()假设事件将被缓冲直到键被重置,并且键将在重置后立即发出信号。下面的测试似乎支持这一点。

你能指点我一些官方文件吗?或讨论缺乏文件?


...在 20 年代允许的范围内sleep(),我做了:

  • 创建一个文件,
  • 编辑它,保存它,
  • 重命名,
  • 编辑它,保存它,
  • 删除它

输出:


谢了。

0 投票
1 回答
712 浏览

java - Java7 WatchService:是否有“内置”方式来忽略特定于操作系统的文件,如 .DS_Store?

所以,我知道忽略这些文件有点可能是“手动方式”。

目前,我这样做:

但这对我来说似乎有点 hacky(好吧,我可以为字符串创建一个枚举,创建一个检查方法等等,但是,在特定于操作系统的生成文件的上下文中,我希望找到一些“内置“为我处理这个。),所以我问你Java7 WatchService中是否有某种内置方式我还没有发现忽略这些文件。

ps:对于我的用例,它(可悲地)不是反过来做的选择,比如“忽略除模式之外的所有文件”。它必须是“允许除极少数文件之外的所有文件”。

0 投票
1 回答
310 浏览

java - 为什么 WatchService 使用未绑定的通配符 WatchEvent而不是 WatchEvent

我只是按照本教程使用WatchServiceAPI。我不知道为什么使用WatchEvent<?>而不是WatchEvent<Path>,如果我使用后者,不需要强制转换,或者还有其他情况WatchService可以用来监视非路径事件

0 投票
1 回答
1153 浏览

java - WatchService 在 CentOS 上使用 100% 的 CPU

WatchService在我的应用程序中使用 a 。当我在环境中运行我的应用程序时Windows,该应用程序使用不到 1% 的CPU. 当相同的应用程序在我的Linux服务器上运行时,它使用 100% 的CPU. 当WatchService线程被禁用时,CPU它恢复正常。

我正在CentOS 5.9使用OpenJDK-1.7.0_x86_64.

这是线程:

为什么它使用100%CPU?

0 投票
1 回答
776 浏览

java - 如何使用 Java 索引整个硬盘驱动器/文件系统?

我想使用 Java 来获取整个硬盘驱动器上的文件更改。例如 c:\ 或 /mnt/drives/hdd1

这是一个要求,因为许多不同的计算机使用不同的文件结构,不能轻易更改而不影响其他软件。但是应该索引特定的文件和文件类型。它们可以存在于驱动器 c:\ d:\ e:\ 和任何子文件夹中。

Java WatchService 无法完成这项工作,因为您必须手动添加每个子目录。超过 10+k 个文件夹是不可行且缓慢的。

我在 JAVA 中寻找这样的东西:

C# 和 Java 实现之间的区别:如果我使用管理员权限运行 WatchService Java 代码,我可以访问 c:\$Recycle.Bin 但不能访问 c:\Documents 和设置。我收到拒绝访问异常。有人可以告诉我为什么吗?正如我提到的 WatchService 不是解决方案,因为它需要很长时间才能爬取所有子目录。注册每个子文件夹并使用成对的 WatchKey 和 java.nio2.Path 维护一个 Map 对于 10,000+ 来说是一个非常糟糕的解决方案文件夹。

JAVA实现:

0 投票
1 回答
67 浏览

java - 在继续之前确保文件夹树完整

我正在编写一个 hotfolder 类型的程序,将拖入我指定上传文件夹的文件+文件夹上传到云服务。

快速概述我想如何做到这一点:

  1. WatchService 通知我某些内容已被拖入文件夹。
  2. Files.walkFileTree 遍历被拖拽的文件夹,在云服务中创建文件夹来模拟被拖拽的文件夹结构
  3. 将我遇到的文件上传到各自的文件夹。

我的问题是我无法找到最可靠的方法来确保我的嵌套目录树已完全复制到我的监视文件夹中。walkFileTree 方法在调用时立即“快照”目录树,因此它无法检测调用后创建的文件夹。这会导致问题,因为我用来检测更改的函数在调用后不会看到发生的更改。

为了解决这个问题,我在步行之前添加了一个 Thread.sleep(3000) ,但这太随意了,偶尔会失败。关于如何驯服这只野兽的任何想法?

有没有在调用时不设置树结构的实时文件树遍历器?我注定要编写自定义函数吗?(开玩笑,这听起来很有趣。)。

0 投票
2 回答
1137 浏览

java - WatchService 冻结 JavaFX GUI

我有一个 JavaFX 应用程序,它必须在文件重命名时触发。我是 WatchService 的新手,我已经完成了演示,并且可以正常工作。

虽然,演示是具有 1 类的简单应用程序。现在我想在我自己的应用程序中实现它,创建一个单独的类来处理 WatchService。

主类:

使用 WatchDirectory:

我遇到的问题是它可以工作,但我的 GUI 立即冻结。因此,为什么我把 watchdirectory.Register(); 在 RunLater 中,希望它不会影响主 JavaFX 应用程序线程。

(我知道它可以工作,因为每当我在“D:\Test”中创建/重命名文件时,输出都会继续响应“创建触发!”)

0 投票
1 回答
1596 浏览

java - 如何使用 WatchService 监视多个目录?

没看懂怎么弄

会知道要报告哪个目录?它是否报告它注册的每个目录?

如果我有多个观察者,他们会只报告那些针对他们注册的目录吗?

register()返回值的目的是什么?看起来它从未在此处的描述中使用过:http: //docs.oracle.com/javase/tutorial/essential/io/notification.html

0 投票
1 回答
492 浏览

java - 使用监视服务测试代码

我正在尝试对一小段使用 WatchService (Java 7) 的逻辑进行单元测试。虽然,由于无限循环,这比预期的要困难得多:

有什么想法我会怎么做?甚至可以在不使用无限循环的情况下实现相同的功能吗?另外,我不确定我是否理解 key.take() 和 key.pollEvents() 之间的区别。我需要两者吗?