【问题标题】:Callback/event from Java timer [closed]Java计时器的回调/事件[关闭]
【发布时间】:2012-11-22 19:28:03
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: java events timer callback


    【解决方案1】:

    基本上,您可以编写一个包装类,将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

    【讨论】:

    • 我认为最好的答案在你答案的最后一部分——使用文件系统提供的 WatchService。 1+
    • @HovercraftFullOfEels 我同意,但我没有上下文,P 可能正在使用 Java 6 或者它可能是自学练习
    • 这看起来不错 (+1),我会试一试...是的,我正在使用 Java 6(在 osx 上:()
    【解决方案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();
    

    【讨论】:

    • 这是哪个 Timer 类?我正在使用java.util.Timer
    • 虽然我喜欢javax.swing.Timer,但我不愿意在这种情况下使用它。读取文件目录(和/或子目录)并不是最快的过程,并且会每秒触发 UI 暂停,这会让我发疯:P。关于同步 UI 的观点是有效的,但我会使用 SwingUtilities.invokeLater 甚至可能使用 SwingWorker 来代替
    • 原始发帖人没有说明他的问题与 Swing 相关,因此如果没有这些必要的信息,尚不推荐使用 javax.swing.Timer。
    • @MadProgrammer 我对这个社区还很陌生,还处于早期学习阶段,我试图用我知道的方式帮助那个人,我希望没有问题!但我真的很感谢你向我解释为什么我的方法不对。非常感谢 ! :)
    • 编辑:实际上他在他的问题中声明他没有使用 Swing 并且对 Swing 解决方案不感兴趣,所以鉴于此,您的答案是不正确的。
    猜你喜欢
    • 2015-09-08
    • 1970-01-01
    • 2015-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-10
    相关资源
    最近更新 更多