java 使用watchService 监听文件夹 代码
时间: 2023-09-03 19:27:12 浏览: 162
### 回答1:
下面是 Java 代码示例,它使用 `WatchService` 监听文件夹:
```
import java.io.IOException;
import java.nio.file.*;
public class FileWatcher {
public static void main(String[] args) {
try {
WatchService watcher = FileSystems.getDefault().newWatchService();
Path dir = Paths.get("/path/to/watch");
dir.register(watcher, StandardWatchEventKinds.ENTRY_CREATE, StandardWatchEventKinds.ENTRY_DELETE,
StandardWatchEventKinds.ENTRY_MODIFY);
System.out.println("Watch Service registered for dir: " + dir.getFileName());
while (true) {
WatchKey key;
try {
key = watcher.take();
} catch (InterruptedException ex) {
return;
}
for (WatchEvent<?> event : key.pollEvents()) {
WatchEvent.Kind<?> kind = event.kind();
@SuppressWarnings("unchecked")
WatchEvent<Path> ev = (WatchEvent<Path>) event;
Path fileName = ev.context();
System.out.println(kind.name() + ": " + fileName);
if (kind == StandardWatchEventKinds.ENTRY_MODIFY && fileName.toString().equals("DirectoryToWatch.java")) {
System.out.println("My source file has changed!!!");
}
}
boolean valid = key.reset();
if (!valid) {
break;
}
}
} catch (IOException ex) {
System.err.println(ex);
}
}
}
```
该代码创建了一个 `WatchService` 实例,并将目录 `/path/to/watch` 注册为监听的目录。它将监听文件夹内的文件创建、删除和修改事件。
这是一个死循环,监听服务会在目录上等待任何事件。如果事件发生,该代码将打印事件类型(例如 `ENTRY_CREATE`)和事件上下文(即文件名)。如果事件是文件修改事件,且文件名为 `DirectoryToWatch.java`,它将打印一条信息。
请注意,该代码仅提
### 回答2:
Java提供了WatchService类来监听文件夹中的文件变化。下面是一个使用WatchService监听文件夹的示例代码:
```java
import java.nio.file.*;
import java.nio.file.WatchEvent.Kind;
import java.nio.file.attribute.BasicFileAttributes;
public class WatchServiceDemo {
public static void main(String[] args) throws Exception {
// 创建WatchService对象
WatchService watchService = FileSystems.getDefault().newWatchService();
// 需要监听的文件夹路径
Path dir = Paths.get("/path/to/directory");
// 注册监听事件,这里我们监听文件的创建、修改和删除事件
dir.register(watchService, StandardWatchEventKinds.ENTRY_CREATE,
StandardWatchEventKinds.ENTRY_MODIFY, StandardWatchEventKinds.ENTRY_DELETE);
// 启动一个线程来处理文件变化事件
Thread thread = new Thread(() -> {
try {
while (true) {
// 获取下一个文件变化事件
WatchKey key = watchService.take();
// 遍历文件变化事件
for (WatchEvent<?> event : key.pollEvents()) {
// 获取事件类型
Kind<?> kind = event.kind();
// 获取事件发生的文件路径
Path file = (Path) event.context();
// 打印事件类型和文件路径
System.out.println(kind + ": " + file);
}
// 重置WatchKey,否则下一次将无法接收到文件变化事件
key.reset();
}
} catch (Exception e) {
e.printStackTrace();
}
});
// 启动文件监听线程
thread.start();
// 等待线程结束
thread.join();
}
}
```
上述代码中,我们首先创建了一个WatchService对象。然后,通过调用register方法将需要监听的文件夹路径和要监听的事件类型注册到WatchService中。在我们的例子中,我们监听了文件的创建、修改和删除事件。
接下来,我们创建一个新的线程来处理文件变化事件。在这个线程中,我们通过调用take方法获取下一个文件变化事件的WatchKey对象。然后通过遍历WatchKey的pollEvents方法获取每个事件的类型和文件路径,并输出到控制台。最后,我们重置WatchKey,以便下一次接收文件变化事件。
最后,我们启动文件监听线程,并等待线程结束。
这样,就完成了使用WatchService类来监听文件夹的代码。当文件夹中的文件发生变化时,代码将会输出对应的事件类型和文件路径。
### 回答3:
使用Java的WatchService类可以方便地在文件夹中进行文件和目录的监视。下面是一个简单的Java代码示例,演示如何使用WatchService来监听文件夹:
```java
import java.io.IOException;
import java.nio.file.*;
public class FolderWatcher {
public static void main(String[] args) {
try {
// 创建WatchService对象
WatchService watchService = FileSystems.getDefault().newWatchService();
// 注册要监听的文件夹
Path folderPath = Paths.get("/path/to/folder");
folderPath.register(watchService, StandardWatchEventKinds.ENTRY_CREATE, StandardWatchEventKinds.ENTRY_DELETE, StandardWatchEventKinds.ENTRY_MODIFY);
System.out.println("开始监听文件夹:" + folderPath);
// 监听文件夹中的事件
WatchKey key;
while ((key = watchService.take()) != null) {
for (WatchEvent<?> event : key.pollEvents()) {
WatchEvent.Kind<?> kind = event.kind();
if (kind == StandardWatchEventKinds.OVERFLOW) {
continue;
}
// 获取发生的事件和文件路径
WatchEvent<Path> watchEvent = (WatchEvent<Path>) event;
Path fileName = watchEvent.context();
// 打印事件类型和文件路径
System.out.println(kind.name() + ": " + folderPath.resolve(fileName));
}
// 重置WatchKey对象,以便继续监听
boolean valid = key.reset();
if (!valid) {
break;
}
}
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
}
}
```
在上面的代码中,首先创建了一个WatchService对象,然后指定要监听的文件夹,并将其注册到WatchService中。接着,使用while循环来监听文件夹中的事件。在循环中,使用take()方法从WatchService获取WatchKey对象,并通过pollEvents()方法获取WatchEvent对象列表。在列表中,可以获取到事件的类型和文件路径。最后,使用reset()方法重置WatchKey对象,以便继续监听。
需要注意的是,上述代码中需要替换"/path/to/folder"为实际要监听的文件夹路径。另外,监听到的文件和目录变化将会以事件的形式进行处理,可以根据需要进行相应的逻辑操作。
希望以上的回答对您有所帮助!
阅读全文