0

ディレクトリ内の新しいファイルをチェックするための基本的なファイルモニターを作成しています。私はJavaの経験があまりないので、これを行うための推奨される方法はわかりませんが、次のことを念頭に置いています。

  1. タイマーとTimerTaskサブクラスを作成して、ディレクトリパスの変更を確認します
  2. ディレクトリが変更された場合/新しいファイルが追加された場合は、イベントをディスパッチ/TimerTaskサブクラスから通知します

私はJavaでイベントディスパッチを行っていませんが、少しグーグルで検索したところ、現時点では興味のないswing/GUIコンポーネントを中心に多くの結果が見つかりました。Observableクラスも調べていましたが、問題は、2つのクラスを拡張できないため、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 に答える