当前位置: 首页 > 面试题库 >

监视Java中的文件和目录更改

高正初
2023-03-14
问题内容

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

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

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

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

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

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


问题答案:

这将允许您尝试在D:\ Temp下创建,删除,移动和重命名文件,并且应该使您了解所需内容:

import static com.sun.nio.file.ExtendedWatchEventModifier.FILE_TREE;
import static java.nio.file.StandardWatchEventKinds.ENTRY_CREATE;
import static java.nio.file.StandardWatchEventKinds.ENTRY_DELETE;
import static java.nio.file.StandardWatchEventKinds.ENTRY_MODIFY;

import java.nio.file.FileSystem;
import java.nio.file.FileSystems;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.WatchEvent;
import java.nio.file.WatchKey;
import java.nio.file.WatchService;

public class Foo3
{
    public static void main(String[] args) throws Exception
    {
        FileSystem fs = FileSystems.getDefault();
        WatchService ws = fs.newWatchService();
        Path pTemp = Paths.get("D:/Temp");
        pTemp.register(ws, new WatchEvent.Kind[] {ENTRY_MODIFY, ENTRY_CREATE, ENTRY_DELETE}, FILE_TREE);
        while(true)
        {
            WatchKey k = ws.take();
            for (WatchEvent<?> e : k.pollEvents())
            {
                Object c = e.context();
                System.out.printf("%s %d %s\n", e.kind(), e.count(), c);
            }
            k.reset();
        }
    }
}


 类似资料:
  • 问题内容: 我正在使用WatchService来监视目录中的更改,尤其是在目录中创建新文件。下面是我的代码- 当我在“ mk”目录中创建文件时,我正在收到通知。但是,当我在此目录中复制某些文件时,打开该复制文件时出现异常。 我的猜测是Windows Copier对话框仍然锁定了该文件,而我无法打开该文件。因此,基本上我想知道是如何通知文件已被其他进程关闭。 上面代码的输出就像- 我已创建文件“ ”

  • 问题内容: 我想在目录中监视来自C应用程序的新文件。但是,我对修改后的文件不感兴趣,仅对新文件感兴趣。目前,我为此目的使用readdir / stat: 知道如何在不保留文件列表的情况下检测 Linux和Solaris 10 上新创建的文件吗? 问题答案: 解决方案是将最后访问时间存储在全局变量中,并使用过滤器选择最新文件: : 统计信息(由路径扩展,但这仅是详细信息) 统计信息(由路径扩展,但这

  • 问题内容: 我在目录C:/ java / newfolder中做了一些检测更改的代码,它工作正常。我在下面给出。 现在我只看目录。但是我只需要看所有子目录。 对于前: 我在子目录上方给出了示例 c:/ java / newfolder / * .. 我需要观看所有子目录给我一些解决方案吗? 问题答案: 我对API 并不熟悉,因此请仔细阅读以下内容。 您正在注册一个要监视的目录,每当其直接后代之一被

  • 问题内容: 我一直在编写一个监视目录的程序,当在目录中创建文件时,它将更改名称并将其移至新目录。在我的第一个实现中,我使用了Java的Watch Service API,当我测试1kb文件时,它可以正常工作。出现的问题是实际上创建的文件在50-300mb之间。发生这种情况时,观察程序API会立即找到该文件,但由于仍在编写中而无法移动它。我尝试将观察程序置于一个循环中(该异常会生成异常,直到可以移动

  • 问题内容: 我正在编写一个bash脚本,我想监视文件在目录中的更改(添加,删除和重命名),并相应地执行不同的操作。 有没有一种方法可以直接从我的脚本中执行此操作(除了定期创建目录和make之外)? 问题答案: 您可以使用以下命令(假设您的发行版支持inotify,大多数情况下这样做):

  • 问题内容: 就像一个类似的SO问题一样,我正在尝试监视Linux机器上的目录以添加新文件,并希望在这些新文件到达时立即对其进行处理。关于实现此最佳方法的任何想法? 问题答案: 看inotify。 使用inotify,您可以监视用于文件创建的目录。