问题标签 [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 投票
2 回答
4391 浏览

java - 如何使用 WatchService 监视子目录的更改?(爪哇)

我想观察一些目录的变化和她的子目录。我试图这样做,WatchService但我不知道文件是从哪个目录更改的。如何从 中检索完整路径WatchEvent

0 投票
3 回答
4736 浏览

java - WatchService 和 SwingWorker:如何正确执行?

WatchService 听起来像是一个令人兴奋的想法......不幸的是,它似乎与教程/api 中警告的一样低级,而且并不真正适合 Swing 事件模型(或者我遗漏了一些明显的东西,不是零概率

从教程中的 WatchDir 示例中获取代码(简化为仅处理单个目录),我基本上结束了

  • 扩展 SwingWorker
  • 在构造函数中做注册的东西
  • 在 doInBackground 中放置等待键的无限循环
  • 通过 key.pollEvents() 检索时发布每个 WatchEvent
  • 通过使用已删除/创建的文件作为 newValue 触发 propertyChangeEvents 来处理块

    /li>

基本思想是让使用代码幸福地不知道粘糊糊的细节:它监听属性更改并根据需要更新任意模型:

好像有效果,但是感觉不舒服

  • 将我自己作为线程不可知论者:到目前为止,我看到的所有示例片段都使用 watcher.take() 阻塞了等待线程。他们为什么这样做?预计至少有些人会使用 watcher.poll() 并睡一会儿。
  • SwingWorker 发布方法似乎不太适合:现在没关系,因为我只在看一个目录(不想在错误的方向上飞得太远 :) 尝试观看多个目录时(如原始 WatchDir 示例)有几个键和相对于其中之一的 WatchEvent。要解析路径,我需要事件和密钥正在监视的目录[A] - 但只能传递一个。不过,很可能逻辑的分布是错误的

[A]已编辑(由@trashgods 的评论触发) - 实际上这不是我必须与事件一起传递的密钥,而是它报告更改的目录。相应地改变了问题

仅供参考,这个问题是交叉发布到OTN swing 论坛

附录

阅读 WatchKey 的 api 文档:

如果有多个线程从监视服务检索信号键,则应注意确保仅在处理对象的事件后调用重置方法。

似乎暗示这些事件应该

  1. 在检索 WatchKey 的同一线程上进行处理
  2. 重置钥匙后不应触摸

不完全确定,但结合递归观看目录(多个)的(未来)要求,决定遵循@Eels 的建议,有点 - 很快就会发布我确定的代码

编辑 刚刚接受了我自己的答案 - 如果有人有合理的反对意见,我会谦虚地回复

0 投票
2 回答
1334 浏览

java - Java 7 WatchService:在处理程序中更改事件源时避免事件无限循环

基本上,我使用全新的 Java 7 WatchService 来监视目录。

我有一个处理程序链,监听目录发出的每个 IO 事件。

问题是一些处理程序需要以某种方式更改这些 IO 事件(== 文件)的原因。例如,如果有人将文件放入受监视的文件夹中,则其中一个处理程序可能会更改其扩展名,将某些内容附加到其文件名或其他内容。

这些动作当然会触发新的 IO 事件,并且前面提到的处理程序会得到它们。然后他们再次进行更改。这显然会导致无限循环......

Java 是否提供任何方法来处理这种情况?如果没有,您将如何处理?

基本上,我只想在事件不是由这些处理程序的操作引起时才运行我的事件处理程序。

更新:至于解决方案,我宁愿只在主事件路由器的代码中进行更改,也不愿在我编写的每个处理程序中担心这一点(“处理程序只有在以前没有做过的情况下才会进行更改”)。

0 投票
5 回答
23648 浏览

java - Java WatchService 在观看映射驱动器时不生成事件

我实现了一个文件观察器,但我注意到 java nio 文件观察器不会为在映射驱动器上复制的文件生成事件。例如,我在 Unix 上运行文件观察器来观察/sharedfolder映射到 windows () 上的本地目录 () H:\,然后我在这个目录 ( H:\) 中放置了一个文件,但文件观察器没有生成任何事件. 现在,如果我在 Windows 上运行文件观察器来观察映射驱动器 ( H:\),它指的是一个 unix 路径 ( /sharedfolder),并且从 unix 我将一个文件放在这个文件夹中,文件观察器会识别更改并生成一个事件。它看起来像一个错误,或者我可能遗漏了一些东西,有什么想法吗?

0 投票
2 回答
616 浏览

java - 检查所有文件句柄何时在 Java 中释放

我想监视一个目录,当一个文件出现在那里打开它,处理它,然后将它移动到另一个目录。问题是如何检查其他程序是否已完成编写。在 Java 7 中,我可以使用 FileSystem 中的 WatchService,但我只能检查文件的创建时间。我想知道何时释放所有文件句柄。

我的第一个想法是我可以获得一个排他锁,但事实证明可以在另一个应用程序实际更新文件时踢出它。

在 Java 中执行此操作的首选方法是什么?谢谢!

0 投票
2 回答
4018 浏览

java - Java I/O:确保文件在任何 r/w 操作之前没有被另一个进程锁定

我在基于 Java 7 WatchService API 跟踪目录中文件内容的应用程序中遇到了一个反复出现的问题。当底层文件系统对文件触发修改事件时,我想立即计算其 SHA-256。

但是经常发生另一个进程打开了文件(即 Word),从而保留了排他锁并阻止我的应用程序进行任何读/写操作。如果针对打开的文件创建了任何流/通道,则会抛出用于 nio API 的 FileNotFoundException 或 FileSystemException,并带有如下消息:

该进程无法访问该文件,因为它正被另一个进程使用

当文件实际上不存在于 fs 上时,我无法提供一种解决方案来检测此类情况,而不会掩盖“真实”的 FileNotFoundException。

我想出了通过 File.exists 检查存在性的想法,然后如果在打开流时抛出 FileNotFoundException,我将能够推断出文件已被锁定。我对这方面的任何意见持开放态度!

谢谢!

0 投票
3 回答
1745 浏览

java - JAVA 7 手表服务

如何让监视服务在应用程序启动时处理目录中的任何文件?

我已经运行了应用程序,但我注意到只处理目录中删除的新文件,但忽略从一开始就存在的文件。

0 投票
2 回答
10640 浏览

java - Java 7 WatchService 对其他人来说很慢吗?

WatchService 看起来是一项很棒的技术,但它太慢了,无法在我测试过的 OS X 和 Linux 系统上使用。雪上加霜的是,它似乎也没有收到所有事件的通知。

我自己的代码和 Oracle 的规范示例都是这种情况。(http://docs.oracle.com/javase/tutorial/displayCode.html?code=http://docs.oracle.com/javase/tutorial/essential/io/examples/WatchDir.java

我认识到 OS X OpenJDK 端口不确定此功能(请参阅https://wikis.oracle.com/display/OpenJDK/Mac+OS+X+Port+Project+Status

有没有人成功地在生产中使用它?

0 投票
1 回答
640 浏览

java-7 - Java 7 中的 WatchService 问题

我正在使用 jdk7 的 WatchService API 来监视文件系统上的文件夹。我正在通过电子邮件向该文件夹发送一个新文件,当文件进入该文件夹时,我会触发 ENTRY_CRATE 选项。它工作正常。但问题是它生成了两个 ENTRY_CREATE 事件,而不是我正在调用的一个事件。

以下是代码:

在上面的代码中,我将事件大小设置为 2。

谁能帮我找出我得到两个事件的原因。

0 投票
1 回答
624 浏览

java-7 - 我可以在 Java 7 中创建多少个 newWatchService?

我可以制作多少个 newWatchService ?

--> 结果:IOExeption:打开的文件太多...