问题标签 [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.
java - java 7 nio 2程序的意外输出
我正在尝试来自Pro Java 7 NIO.2 第 118 页的小程序
代码是:
但是,当我更改global.properties
文件夹中存在的(或任何文件)中的一行时,C:\\Java
我得到的输出为 -
为什么会引发 2 次事件?
Java中是否有任何服务可以检测文件中精确修改的行/行?
JDK:jdk1.7.0_09
IDE:Eclipse Java EE IDE 版本:Juno 发布
平台:Windows 7
java - 暂停 WatchService WatchKey Java
我有 2 个文件夹,我为每个文件夹注册了一个具有相同 WatchService 的 WatchKey...当我在一个文件夹中更改某些内容时,显然会有一个 WatchEvent。但是当我有一个事件时,我想更改另一个文件夹中的某些内容,而不需要为另一个文件夹获取另一个事件。因为那会导致无限循环:(
我这样的代码不能正常工作:
java - Java7 WatchService - 如何检测实际监视目录的重命名/移动
我正在使用WatchService
应用程序工作台同步数据文件。当我重命名/移动监视目录时,我没有收到任何事件,WatchKey 也不会变得无效。我仍然从重命名的目录中获取事件,但据我所知,没有办法找出 WatchKey 的实际路径WatchKey.watchable()
,但仍然返回原始目录路径。我想避免需要锁定监视目录以防止更改,因为我希望使应用程序尽可能轻量级。
我在 Windows 7 上使用 JDK 7u10 遇到了这个问题
您是否知道此问题的任何解决方法,而无需锁定目录或查看所有目录到根目录?
更新
在 Linux 上,我观察到了同样的行为。
到目前为止,我现在似乎有三个选择。
1)依靠用户的纪律,他/她不会移动数据目录。我不太喜欢这个选项,因为它可能会导致未定义的行为。
2)使用更广泛的非标准原生库
3) 在上级目录上创建看门狗的层次结构。这些将仅接受ENTRY_DELETE
事件,因为此事件(或OVERFLOW
)必须在实际监视的目录被移动或删除时出现,因此无效。
java - JAVA NIO Watcher:如何检测持久(复制)操作的结束?
我需要对目录中新引入的文件进行一些 ZIP 操作。我在那里订阅了 CREATE 事件,该事件被触发了。复制到该目录的操作需要一些时间。
所以我在访问文件时得到 ACCESS_DENIED,“被另一个进程锁定”。
NIO 是否提供诸如“LOCK Released”之类的东西,还是我需要以某种方式轮询文件以释放锁?就像这里描述的:http://stackoverflow.com/questions/750471/how-to-know-whether-a-file-copying-is-in-progress-complete-in-java-1-6
谢谢你的帮助。
格尔德
java - Java 7 Directory WatchService 不检测新文件
我已经实现了一个 WatchService 来监听 Linux (Redhat6) 文件系统上的单个文件夹。当我将文件拖放到文件夹(通过 WinSCP)时,会检测并处理该文件。但是,当 FTP 进程删除文件夹中的文件时。他们没有被捡起来??
这是线程代码
当我在受监视的文件夹中删除并删除相同的文件(应该已拾取)时,它会被检测到并拾取(因此 Watcher 正在工作并启动并运行)。所以在 FTP 复制过程中的某个地方出现了问题。现在唯一的区别是该文件以根用户身份通过 FTP 传输到该文件夹,但所有文件的 READ 访问权限都是 ON。当我 SCP 文件时,我是另一个用户(拥有 WatcherThread 的同一用户)。
这是问题吗,其他用户拥有的文件没有被拾取?如果是这样,如何解决这个问题?
谢谢你的帮助,科恩
更新:我尝试使用两个不同的非 root 用户进行 SCP,然后检测并拾取文件。我试图在整个文件夹上设置一个 umask 0000 ,但没有效果。
java - 如何使用 Java 7 WatchService 省略对某些文件的检测
我已经成功地向监视器注册了 CREATE、MODIFY 和 DELETE 事件,它们对我来说工作得很好。对于我的问题,我想在触发 CREATE 事件后进行一些文件修改,例如“重命名”,因此接下来也会触发 MODIFY 事件,但是我不想要它。这次我可以省略 MODIFY 事件吗?
java - Java 7 WatchService - 该进程无法访问该文件,因为它正在被另一个进程使用
我按照Watching a Directory for Changes Java7 nio2 教程使用代码示例 WatchDir.java 递归地监视目录的全部内容。
代码如下所示:
好的,所以问题(我肯定会做一些愚蠢的事情)就在这里:
它的作用是这样的:
我第一次处理事件时,一切正常!即使有超过 1 个文件要处理。但是在连续的时间里,我收到了这个错误信息:
该进程无法访问该文件,因为它正被另一个进程使用
我在这里做错了什么?我该怎么做才能成功处理连续文件?
我忘记提及的两个重要注意事项:
- 我正在使用 Windows 7。
- 当我在调试模式下运行应用程序时,它可以工作。
编辑:如果我在尝试使用文件之前添加一个睡眠,它会起作用:
那么,有没有可能是 Windows 没有及时解锁文件呢?我该如何解决(以适当的方式)?
java - WatchService.take() 不会在 Windows-7-x64 上等待,同时观察远程目录中的变化
我正在尝试使用 Java SE 7 中提供的 WatchService 观看远程目录(在网络机器上)。当我在 Windows XP 上运行程序时它工作得很好,但在 Windows 7 上 WatchService.take() 不会等待,返回一个无效的密钥。
这是示例代码:
这是输出:
如您所见,我检查了是否可以在此网络目录中写入/删除文件。我也尝试过不映射定义这样的路径://server/workspace
也没有运气。如果我为带有本地目录的注释掉的案例 2 运行相同的程序,那么它会进入等待状态,并且没有预期的输出。
我使用 64 位的 jdk1.7.0_17。(我尝试了 32 位的 jre7,但也没有运气)。远程目录位于 Windows Server 2008 R2 Standard 上。
我在 API 中读到了以下句子,这让我怀疑这根本不可能:
如果监视的文件不在本地存储设备上,则是否可以检测到对文件的更改是特定于实现的。特别是,不需要检测在远程系统上对文件进行的更改。
这对我来说是个坏消息,因为我使用 WatchService 在这个策略上投入了大量时间。有人有任何想法/经验,为什么它不能在 Windows 7 上运行,或者有什么可能吗?如果不是,那将是一种替代方法。
java - Java 7 NIO / JPathWatch 问题 - 在 Windows 中移动目录
我已经实现了一个应用程序,它使用 Java NIOWatchService
来监视目录树中文件和文件夹的更改。在 Windows XP 上运行,所有文件系统更改都被拾取 - 除了通过在资源管理器中拖放将目录移动到受监视的树中。
拾取事件用于剪切和粘贴目录(ctrl+x、ctrl+v),而不是拖放(编辑- 请参阅下面的更新)。
我已经使用JPathWatch重新实现了解决方案,但是这也遇到了同样的问题。
我正在注册标准ENTRY_CREATE
,ENTRY_DELETE
并且在 Windows 上运行应用程序ENTRY_MODIFY
时还使用了好奇的未充分记录的文件com.sun.nio.file.ExtendedWatchEventModifier
来避免其他问题。
除了投票——我真的不想这样做——有人有什么想法吗?
更新
问题一般是移动文件 - 我误认为 ctrl+x/ctrl+v 工作。有关说明,请参见下面的解决方案。
java - 为什么 WatchService 会产生这么多操作?
当我运行它然后打开记事本++然后创建一个新的空文件并将其保存a.txt
在C:\tmp\
目录中时,我得到了输出:
这是为什么?看起来该文件已创建然后删除然后再次创建。为什么?
当我在文件中放入一些文本并保存时,输出为:
为什么变了两次?