来自Java计时器的回调/事件

时间:2012-11-22 19:28:04

标签: java events timer callback

我正在编写一个基本文件监视器来检查目录中的新文件。我没有很多Java经验,所以我不知道推荐的方法是什么,但这就是我的想法:

  1. 创建一个Timer和一个TimerTask子类来检查目录路径中的更改
  2. 如果目录已更改/添加了新文件,则从TimerTask子类发送事件/通知
  3. 我没有在Java中进行过任何事件调度,但谷歌搜索了一下,发现很多结果都围绕着我对此感兴趣的swing / gui组件。我也在查看Observable类,但问题是我需要从TimerTask子类通知我不能做,因为我不能扩展两个类。该项目应该足够简单,一个基本的回调(从TimerTask子类外部传递对函数的引用,以便在满足条件时从TimerTask中调用)。

    你推荐什么?什么是最简单的方法?

2 个答案:

答案 0 :(得分:2)

这应该解决目的

ActionListener al = new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent arg0) {

                // Check Your Directory for changes
            }
        };

Timer t = new Timer(1000,al); // Timer(TimeInMilliSeconds, ActionListener) 1000ms = 1s 
t.start();

答案 1 :(得分:2)

基本上你可以编写一个包装类,它将TimerTimerTask封装到一个自我管理的容器中。

此类可以使用方法向感兴趣的各方添加/删除侦听器和触发事件。

例如;

 public class FileWatcher {

      private Timer timer;

      public FileWatcher(File path) {

           timer = new Timer("FileWather", true);
           // Schedule task to start immeditaly and re-fire every second...
           timer.scheduleAtFixedRate(new FileWatcherTask(), 0, 1000);

      }

      public void addFileWatcherListener(FileWatcherListener listener) {
           //...
      }

      public void removeFileWatcherListener(FileWatcherListener listener) {
           //...
      }

      protected void fireFileRemoved(File... files) {
           //...
      }

      protected void fireFileAdded(File... files) {
           //...
      }

      protected void fireFileChanged(File... files) {
           //...
      }

      public class FileWatcherTask extends TimerTask {

           @Override
           public void run() {
                // Look ma, no hands!
           }

      }

 }

现在,显然,您需要自己定义FileWatcherListener,但这是一个基本概念。

现在,如果您使用的是Java 7,则只需使用Watch Service API

即可