采用java实现Linux Tail 功能信息,直接代码:

1.LogFileTailerListener是变化内容输入,

  1. public abstract interface LogFileTailerListener {  
  2.     public abstract void newLogFileLine(String line);  
  3. }  

 2.LogFileTailer 对文件监听

  1. public class LogFileTailer extends Thread {  
  2.      
  3.     private long sampleInterval = 9000;  
  4.  
  5.     private File logfile;  
  6.  
  7.     private boolean startAtBeginning = false;  
  8.  
  9.     private boolean tailing = false;  
  10.  
  11.     private Set listeners = new HashSet();  
  12.  
  13.     public LogFileTailer(File file) {  
  14.         this.logfile = file;  
  15.     }  
  16.   
  17.     public LogFileTailer(File file, long sampleInterval,  
  18.             boolean startAtBeginning) {  
  19.         this.logfile = file;  
  20.         this.sampleInterval = sampleInterval;  
  21.         this.startAtBeginning = startAtBeginning;  
  22.     }  
  23.  
  24.     public void addLogFileTailerListener(LogFileTailerListener l) {  
  25.         this.listeners.add(l);  
  26.     }  
  27.  
  28.     public void removeLogFileTailerListener(LogFileTailerListener l) {  
  29.         this.listeners.remove(l);  
  30.     }  
  31.  
  32.     protected void fireNewLogFileLine(String line) {  
  33.         for (Iterator i = this.listeners.iterator(); i.hasNext();) {  
  34.             LogFileTailerListener l = (LogFileTailerListener) i.next();  
  35.             l.newLogFileLine(line);  
  36.         }  
  37.     }  
  38.  
  39.     public void stopTailing() {  
  40.         this.tailing = false;  
  41.     }  
  42.  
  43.     public void run() {  
  44.         long filePointer = 0;  
  45.  
  46.         if (this.startAtBeginning) {  
  47.             filePointer = 0;  
  48.         } else {  
  49.             filePointer = this.logfile.length();  
  50.         }  
  51.  
  52.         try {  
  53.             RandomAccessFile file = new RandomAccessFile(logfile, "r");  
  54.             while (this.tailing) {  
  55.                 long fileLength = this.logfile.length();  
  56.                 if (fileLength < filePointer) {  
  57.                     file = new RandomAccessFile(logfile, "r");  
  58.                     filePointer = 0;  
  59.                 }  
  60.                 if (fileLength > filePointer) {  
  61.                     file.seek(filePointer);  
  62.                     String line = file.readLine();  
  63.                     while (line != null) {  
  64.                         this.fireNewLogFileLine(line);  
  65.                         line = file.readLine();  
  66.                     }  
  67.                     filePointer = file.getFilePointer();  
  68.                 }  
  69.                 sleep(this.sampleInterval);  
  70.             }  
  71.             file.close();  
  72.         } catch (IOException e) {  
  73.               
  74.         } catch (InterruptedException e) {  
  75.              
  76.         }  
  77.     }  
  78.  
  79.     public void setTailing(boolean tailing) {  
  80.         this.tailing = tailing;  
  81.     }  
  82.  

3.测试

  1. public class Tail implements LogFileTailerListener {  
  2.    public void newLogFileLine(String line) {  
  3.       System.out.println(line);  
  4.    }  
  5.  
  6.    public static void main(String[] args) {  
  7.       LogFileTailer tailer = new LogFileTailer(new File(filename), 1000true);  
  8.       tailer.setTailing(true);  
  9.       tailer.addLogFileTailerListener(this);  
  10.       tailer.start();  
  11.    }