我想创建一个java程序,它可以无限轮询日志文件。每当日志文件中有一些条目时,我都想将最新的内容读取到刚刚写入的文件中。
有人能告诉我做这件事的有效方法吗?因为这应该全天候运行,所以不希望获得cpu峰值。
我做了基础研究,发现了以下几点,但帮助不大:https://blogs.oracle.com/thejavatutorials/entry/watching_a_directory_for_changes
实现这一点的一种非常简单有效的方法是使用WatchService。下面是一个代码示例,当文件被CREATED、MODIFIED和DELETED时,它会引发事件。
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardWatchEventKind;
import java.nio.file.WatchEvent;
import java.nio.file.WatchKey;
import java.nio.file.WatchService;
import java.util.List;
public static void main(String[] args) {
//define a folder root
Path myDir = Paths.get("D:/data");
try {
WatchService watcher = myDir.getFileSystem().newWatchService();
myDir.register(watcher, StandardWatchEventKind.ENTRY_CREATE,
StandardWatchEventKind.ENTRY_DELETE, StandardWatchEventKind.ENTRY_MODIFY);
WatchKey watckKey = watcher.take();
List<WatchEvent<?>> events = watckKey.pollEvents();
for (WatchEvent event : events) {
if (event.kind() == StandardWatchEventKind.ENTRY_CREATE) {
System.out.println("Created: " + event.context().toString());
}
if (event.kind() == StandardWatchEventKind.ENTRY_DELETE) {
System.out.println("Delete: " + event.context().toString());
}
if (event.kind() == StandardWatchEventKind.ENTRY_MODIFY) {
System.out.println("Modify: " + event.context().toString());
}
}
} catch (Exception e) {
System.out.println("Error: " + e.toString());
}
}