2012-01-18 2 views
0

ログファイルを継続的に監視するプログラムを作成しました。しかし、私は複数のログファイルを監視する方法を知らない。これが私が1つのファイルを監視するために行ったことです。次のコードでは、複数のファイルを監視するためにどのような変更を行う必要がありますか?複数のログファイルを同時に監視する

package com.read; 

import java.io.File; 
import java.io.IOException; 
import java.io.RandomAccessFile; 
import java.nio.channels.FileChannel; 
import java.nio.channels.FileLock; 
import java.util.Date; 
import java.util.Timer; 
import java.util.TimerTask; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

public class FileWatcherTest { 

    public static void main(String args[]) { 

     final File fileName = new File("D:/logs/myFile.log"); 

     // monitor a single file 
     TimerTask fileWatcherTask = new FileWatcher(fileName) { 

      long addFileLen = fileName.length(); 
      FileChannel channel; 
      FileLock lock; 
      String a = ""; 
      String b = ""; 

      @Override 
      protected void onChange(File file) { 

       RandomAccessFile access = null; 
       try { 
        access = new RandomAccessFile(file, "rw"); 
        channel = access.getChannel(); 
        lock = channel.lock(); 
        if (file.length() < addFileLen) { 
         access.seek(file.length()); 
        } else { 
         access.seek(addFileLen); 
        } 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
       String line = null; 
       try { 

        while ((line = access.readLine()) != null) { 

         System.out.println(line); 

        } 

        addFileLen = file.length(); 

       } catch (IOException ex) { 
        Logger.getLogger(FileWatcherTest.class.getName()).log(
          Level.SEVERE, null, ex); 
       } 
       try { 
        lock.release(); 
       } catch (IOException e1) { 
        // TODO Auto-generated catch block 
        e1.printStackTrace(); 
       } // Close the file 

       try { 
        channel.close(); 
       } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 

      } 

     }; 

     Timer timer = new Timer(); 
     // repeat the check every second 
     timer.schedule(fileWatcherTask, new Date(), 1000); 
    } 
} 




package com.read; 

import java.util.*; 
import java.io.*; 

public abstract class FileWatcher extends TimerTask { 

    private long timeStamp; 
    private File file; 
    static String s; 

    public FileWatcher(File file) { 
     this.file = file; 
     this.timeStamp = file.lastModified(); 
    } 

    public final void run() { 
     long timeStamp = file.lastModified(); 

     if (this.timeStamp != timeStamp) { 
      this.timeStamp = timeStamp; 

      onChange(file); 
     } 
    } 

    protected abstract void onChange(File file); 
} 
+0

匿名クラスを引き出し、2つのインスタンスをインスタンス化し、各ファイル – milan

+0

に1つは、uはどのように私に言うことができるがそれをするために? – Rookie

+0

ちょうどあなたに言った、あなたは私にあなたのためにそれをやりたい、あるいは何かを教えてほしい? :) – milan

答えて

1

スレッドを使用する必要があります。ここでは良いチュートリアルです:

http://docs.oracle.com/javase/tutorial/essential/concurrency/

次のようなものだろう:

public class FileWatcherTest { 

    public static void main(String args[]) { 
     (new Thread(new FileWatcherRunnable("first.log"))).start(); 
     (new Thread(new FileWatcherRunnable("second.log"))).start(); 
    } 

    private static class FileWatcherRunnable implements Runnable { 
     private String logFilePath; 
     // you should inject the file path of the log file to watch 
     public FileWatcherRunnable(String logFilePath) { 
      this.logFilePath = logFilePath; 
     } 
     public void run() { 
      // your code from main goes in here 
     } 
    } 
} 
+0

お返事ありがとうございます。私はこのようにします。 – Rookie

+0

ねえ、私はこれを試みましたが、予期しない結果が出ています。 – Rookie

+1

スレッドでは、TimerTaskの処理を取り除いて、変更時刻をループで監視するだけで 'Thread.sleep(1000)'を実行できます。代わりに、ファイルのサイズを見たいかもしれません。 – Gray

関連する問題