Java如果文件被修改,则获取通知

时间:2014-04-07 13:23:26

标签: java multithreading file listener

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

我尝试了以下内容:

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。但是,在某些情况下,Node引用的文件会更改为新文件,并且我不希望它自动将状态更改为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)'抛出的异常,因为睡眠被中断,当我检查状态时,它仍然被修改为STATUS.MODIFIED。

我做错了吗?

1 个答案:

答案 0 :(得分:3)

观看服务怎么样: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;
  }
...
}