0

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

  1. 创建 Timer 和 TimerTask 子类以检查目录路径中的更改
  2. 如果目录更改/添加了新文件,则从 TimerTask 子类调度事件/通知

我没有在 Java 中进行任何事件调度,但在 Google 上搜索了一下,发现很多结果都围绕着我目前不感兴趣的 swing/gui 组件。我也在查看 Observable 类,但问题是我需要从 TimerTask 子类通知我不能这样做,因为我不能扩展两个类。该项目应该足够简单,一个基本的回调(从 TimerTask 子类外部传递对函数的引用,以便在满足条件时从 TimerTask 内部调用)就可以了。

你有什么建议吗 ?什么是最简单的方法?

4

2 回答 2

3

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

此类可以具有添加/删除侦听器并向相关方触发事件的方法。

例如;

 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

于 2012-11-22T19:50:20.037 回答
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();
于 2012-11-22T19:35:08.560 回答