【问题标题】:is it possible to monitor folder using java code?是否可以使用 java 代码监视文件夹?
【发布时间】:2010-09-28 08:03:10
【问题描述】:


有谁知道如何使用java监控文件夹?或者任何人都可以给我一点,我该如何开始。这是我的想法。

启动一个线程来扫描文件夹更改,这可能是创建、删除、更新此文件夹中的文件或发生其他事情,例如上次更新。
但在这种情况下,你必须控制线程循环。如果这个线程循环控制不好,会浪费cpu,可能会导致致命的问题。

或者,是否有任何框架或一些演示代码可以做到这一点?希望我们能找到更好的方法来做到这一点。非常感谢。

【问题讨论】:

    标签: java monitoring


    【解决方案1】:

    JDK7 的 java.nio.file 包有一个WatchService 来支持文件更改通知。您可以使用它来监视目录的更改。这在可用的情况下使用本机设施,否则它使用诸如轮询之类的原始机制。 Here 是上面的帖子。

    目前,您可以尝试jpathwatch,它是WatchService 接口的实现,使用本机操作系统功能,而不是轮询。

    【讨论】:

    • 我想我必须等待很长时间,因为我现在的 jre 是 jre6。
    • 我已经检查过这个WatchService,它很棒但很遗憾它只能在jdk7之后可用。
    【解决方案2】:

    你的想法还不错。

    要在 java 中监视文件夹,通常的方法是使用循环在单独的线程中对其进行控制。 为了节省 CPU,您可以使用节奏(每隔 n 秒检查一次)。

    然后,要通知此线程的更改,您可以使用"Observer" design pattern

    【讨论】:

    • 是的,我知道这个样子应该好好照顾。每 n 秒检查一次文件夹会做得很好,但我应该如何确定这样的秒数,因为这段代码将针对不同的 CPU 和不同的操作系统运行。如果我想节省 CPU 和其他东西,这并不容易。但是,谢谢你的回复。
    【解决方案3】:

    纯 Java 方法是分离出一个轮询目录并跟踪更改的线程。

    一种更有效的方法是编写一个特定于操作系统的库(您可能必须用 C 或 C++ 编写),它可以使用特定于操作系统的工具来获取通知(通过回调到您的 Java 代码中),并且通过 JNI 调用它

    【讨论】:

    • 好主意。但是如果我使用操作系统特定的库,这意味着我的应用程序将无法在不同的操作系统中运行。
    • 是的。您可以以这样一种方式对其进行编码,即如果您在具有库的操作系统上运行,则代码将使用它,否则它默认为纯 Java 解决方案。事实上,正如其他答案中提到的,这就是 Java 7 中发生的情况
    【解决方案4】:

    不,不是。有一些图书馆会为您进行投票,例如:

    http://mindprod.com/jgloss/filemonitor.html 是免费的,http://www.teamdev.com/jxfilewatcher 不是免费的

    "理想情况下,您希望避免轮询并立即收到更改通知。为此,需要特定于操作系统的 JNI 代码挂钩到本机文件系统。这也需要高权限。"

    【讨论】:

    • via JNI,意思是为java写跨平台代码,我觉得不太对。
    • jxfilewatcher 不是免费的。我想也许我们可以找到一个开源软件或库来做到这一点。如果没有,我会写的。
    • 我发的第一个链接我认为是免费的
    猜你喜欢
    • 1970-01-01
    • 2012-10-05
    • 2022-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-12
    相关资源
    最近更新 更多