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

监视目录和子目录以在Java中创建,修改和更改

司寇书
2023-03-14
问题内容

我在目录C:/ java / newfolder中做了一些检测更改的代码,它工作正常。我在下面给出。

import java.nio.file.*;
import java.util.List;

public class DirectoryWatchExample {
public static void testForDirectoryChange(Path myDir){

        try {
           WatchService watcher = myDir.getFileSystem().newWatchService();
           myDir.register(watcher, StandardWatchEventKinds.ENTRY_CREATE,
           StandardWatchEventKinds.ENTRY_DELETE, StandardWatchEventKinds.ENTRY_MODIFY);

           WatchKey watckKey = watcher.take();

           List<WatchEvent<?>> events = watckKey.pollEvents();
           for (WatchEvent event : events) {
                if (event.kind() == StandardWatchEventKinds.ENTRY_CREATE) {
                    System.out.println("Created: " + event.context().toString());
                }
                if (event.kind() == StandardWatchEventKinds.ENTRY_DELETE) {
                    System.out.println("Delete: " + event.context().toString());
                }
                if (event.kind() == StandardWatchEventKinds.ENTRY_MODIFY) {
                    System.out.println("Modify: " + event.context().toString());
                }
            }

        } catch (Exception e) {
            System.out.println("Error: " + e.toString());
        }
}

public static void main (String[] args) {
    Path myDir = Paths.get("c:/java/newfolder/");
    //define a folder root
    testForDirectoryChange(myDir);

}
}

现在我只看目录。但是我只需要看所有子目录。

对于前: c:/java/newfolder/folder1, c:/java/newfolder/folder2, c:/java/newfolder/folder3......etc

我在子目录上方给出了示例

c:/ java / newfolder / * ..

我需要观看所有子目录给我一些解决方案吗?


问题答案:

我对PathAPI 并不熟悉,因此请仔细阅读以下内容。

您正在注册一个要监视的目录,每当其直接后代之一被修改/创建/删除时,它将接收通知。

您需要做的第一件事是注册其所有子目录以进行观看:

// Used to filter out non-directory files.
// This might need to filter '.' and '..' out, not sure whether they're returned.
public class DirectoryFilter implements FileFilter {
    public boolean accept(File file) {
        return file.isDirectory();
    }
}


// Add this at the end of your testForDirectoryChange method
for(File dir: myDir.toFile().listFiles(new DirectoryFilter())) {
    testForDirectoryChange(dir.toPath());
}

这将递归地探索您的文件结构并注册每个目录以供观看。请注意,如果您的目录树太深,则递归可能不是可接受的解决方案,您可能需要对其进行“迭代”。

您需要做的第二件事是,每当您收到目录创建事件时,请不要忘记注册新目录以进行监视。

无论如何,这就是我要做的事情,但是手头没有有效的Java 1.7安装,因此我无法对其进行测试。让我知道它是否有效!



 类似资料:
  • 问题内容: 我在这里写的主要是关于从哪里开始的建议。我已经实现了一个类,该类将使用Java的WatchService递归监视目录。它可以很好地检测更改,但是我注意到了一个致命的缺陷:我无法删除包含正在监视的目录的正在监视的目录。这似乎是WatchService的限制。 我还稍微研究了Apache的VFS FileListener,但是在花了大约6个小时的时间来围绕它构建某种包装之前,我想也许我只是

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

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

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

  • 您好,我想用java创建目录和子目录。我的目录结构是从当前应用程序目录开始的,意思是在当前项目目录中,如下所示。。。 我知道如何创建目录,但我需要创建子目录,我用下面的代码尝试了,下一步应该做什么?

  • 问题内容: 我正在创建一个简单的程序,尝试从磁盘中读取“ conf / conf.xml”,但是如果此文件或目录不存在,则会创建它们。 我可以使用以下代码执行此操作: 我的问题是,这是否真的是最优雅的方式?需要创建两个简单的路径以在新的子目录中创建新文件似乎多余。 问题答案: 您可以将声明为,而不是。然后,您可以使用,请参见下面的示例: 或者,按原样使用代码,您可以使用: