http://www.informit.com/guides/content.aspx?g=java&seqNum=226
주기를 두고 while 로 파일의 크기를 비교해서 탐색하는 소스
Listing 1. LogFileTailer.java
package com.javasrc.tuning.agent.logfile; import java.io.*; import java.util.*; /** * A log file tailer is designed to monitor a log file and send notifications * when new lines are added to the log file. This class has a notification * strategy similar to a SAX parser: implement the LogFileTailerListener interface, * create a LogFileTailer to tail your log file, add yourself as a listener, and * start the LogFileTailer. It is your job to interpret the results, build meaningful * sets of data, etc. This tailer simply fires notifications containing new log file lines, * one at a time. */ public class LogFileTailer extends Thread { /** * How frequently to check for file changes; defaults to 5 seconds */ private long sampleInterval = 5000; /** * The log file to tail */ private File logfile; /** * Defines whether the log file tailer should include the entire contents * of the exising log file or tail from the end of the file when the tailer starts */ private boolean startAtBeginning = false; /** * Is the tailer currently tailing? */ private boolean tailing = false; /** * Set of listeners */ private Set listeners = new HashSet(); /** * Creates a new log file tailer that tails an existing file and checks the file for * updates every 5000ms */ public LogFileTailer( File file ) { this.logfile = file; } /** * Creates a new log file tailer * * @param file The file to tail * @param sampleInterval How often to check for updates to the log file (default = 5000ms) * @param startAtBeginning Should the tailer simply tail or should it process the entire * file and continue tailing (true) or simply start tailing from the * end of the file */ public LogFileTailer( File file, long sampleInterval, boolean startAtBeginning ) { this.logfile = file; this.sampleInterval = sampleInterval; } public void addLogFileTailerListener( LogFileTailerListener l ) { this.listeners.add( l ); } public void removeLogFileTailerListener( LogFileTailerListener l ) { this.listeners.remove( l ); } protected void fireNewLogFileLine( String line ) { for( Iterator i=this.listeners.iterator(); i.hasNext(); ) { LogFileTailerListener l = ( LogFileTailerListener )i.next(); l.newLogFileLine( line ); } } public void stopTailing() { this.tailing = false; } public void run() { // The file pointer keeps track of where we are in the file long filePointer = 0; // Determine start point if( this.startAtBeginning ) { filePointer = 0; } else { filePointer = this.logfile.length(); } try { // Start tailing this.tailing = true; RandomAccessFile file = new RandomAccessFile( logfile, "r" ); while( this.tailing ) { try { // Compare the length of the file to the file pointer long fileLength = this.logfile.length(); if( fileLength < filePointer ) { // Log file must have been rotated or deleted; // reopen the file and reset the file pointer file = new RandomAccessFile( logfile, "r" ); filePointer = 0; } if( fileLength > filePointer ) { // There is data to read file.seek( filePointer ); String line = file.readLine(); while( line != null ) { this.fireNewLogFileLine( line ); line = file.readLine(); } filePointer = file.getFilePointer(); } // Sleep for the specified interval sleep( this.sampleInterval ); } catch( Exception e ) { } } // Close the file that we are tailing file.close(); } catch( Exception e ) { e.printStackTrace(); } } }
Listing 2. LogFileTailerListener.java
package com.javasrc.tuning.agent.logfile; /** * Provides listener notification methods when a tailed log file is updated */ public interface LogFileTailerListener { /** * A new line has been added to the tailed log file * * @param line The new line that has been added to the tailed log file */ public void newLogFileLine( String line ); }
Listing 3. Tail.java
package com.javasrc.tuning.agent.logfile; // Import the Java classes import java.util.*; import java.io.*; /** * Implements console-based log file tailing, or more specifically, tail following: * it is somewhat equivalent to the unix command "tail -f" */ public class Tail implements LogFileTailerListener { /** * The log file tailer */ private LogFileTailer tailer; /** * Creates a new Tail instance to follow the specified file */ public Tail( String filename ) { tailer = new LogFileTailer( new File( filename ), 1000, false ); tailer.addLogFileTailerListener( this ); tailer.start(); } /** * A new line has been added to the tailed log file * * @param line The new line that has been added to the tailed log file */ public void newLogFileLine(String line) { System.out.println( line ); } /** * Command-line launcher */ public static void main( String[] args ) { if( args.length < 1 ) { System.out.println( "Usage: Tail <filename>" ); System.exit( 0 ); } Tail tail = new Tail( args[ 0 ] ); } }
'Java' 카테고리의 다른 글
(펌)JAVA - 한글 인코딩 변환 체크 한방에 끝내기 (0) | 2016.09.06 |
---|---|
java exec 공백 파일 실행 (0) | 2012.10.29 |
ResultSet 의 동작 구조 (0) | 2011.06.17 |
디렉토리 존재 여부와 생성 (0) | 2011.06.15 |
[펌] ResourceBundle (0) | 2011.05.30 |