gpt4 book ai didi

Java 在文件被修改时获取通知

转载 作者:行者123 更新时间:2023-12-01 23:05:02 26 4
gpt4 key购买 nike

我正在寻找一种在修改某个文件时收到通知的方法。我想在发生这种情况时调用某个方法,但在某些情况下我也希望不调用该方法。

我尝试了以下方法:

class FileListener extends Thread {
private Node n;
private long timeStamp;

public FileListener(Node n) {
this.n = n;
this.timeStamp = n.getFile().lastModified();
}

private boolean isModified() {
long newStamp = n.getFile().lastModified();

if (newStamp != timeStamp) {
timeStamp = newStamp;
return true;
} else {
return false;
}

public void run() {
while(true) {
if (isModified()) {
n.setStatus(STATUS.MODIFIED);
}
try {
Thread.sleep(1000);
} catch(Exception e) {
e.printStackTrace();
}
}
}

Node 类包含对文件的引用、STATUS(枚举)以及对该文件的 FileListener 的引用。当文件被修改时,我希望状态更改为 STATUS.MODIFIED。但是,在某些情况下,节点引用的文件更改为新文件,我不希望它自动将状态更改为“已修改”。在这种情况下,我尝试了以下方法:

n.listener.interrupt(); //interrupts the listener
n.setListener(null); //sets listener to null
n.setFile(someNewFile); //Change the file in the node
//Introduce a new listener, which will look at the new file.
n.setListener(new FileListener(n));
n.listener.start(); // start the thread of the new listener

但是我得到的是“Thread.sleep(1000)”抛出的异常,因为 sleep 被中断,当我检查状态时,它仍然被修改为STATUS.MODIFIED。

我做错了什么吗?

最佳答案

watch 服务怎么样:http://docs.oracle.com/javase/7/docs/api/java/nio/file/WatchService.html

WatchService watcher = FileSystems.getDefault().newWatchService();
Path dir = ...;
try {
WatchKey key = dir.register(watcher, ENTRY_MODIFY);
} catch (IOException x) {
System.err.println(x);
}

然后:

for (;;) {
//wait for key to be signaled
WatchKey key;
try {
key = watcher.take();
} catch (InterruptedException x) {
return;
}

for (WatchEvent<?> event: key.pollEvents()) {
WatchEvent.Kind<?> kind = event.kind();
if (kind == OVERFLOW) {
continue;
}
...
}

关于Java 在文件被修改时获取通知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22913800/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com