File Watcher Jobs in Java using Apache Commons (JDK1.6)
What is the Objective: we want to invoke something based on some event in our file system, event could be
1. Directory creation/deletion/movement
2. File Creation/deletion/movement
What we are saying here we want to do some activity based on some event happening in the file system, the first thing should ring in our mind, are we looking for some listener ? – Which can listen to the events and respond accordingly.
Yes, that is what I am going to explain you here, the Listener provided by Apache Common library:
org.apache.commons.io.monitor.FileAlterationListener
(Please download the commons.io jars in case you don’t have from here)
For any Listener three things required:
1. Listener itself.
2. The Observer – which will be configured to observe on certain path and based on the event happening in that path, will call the corresponding method of the listener. Apache observer is org.apache.commons.io.monitor.FileAlterationObserver.
3. The last, one active thread which will have this observer running inside it for any event – Apache active thread is
org.apache.commons.io.monitor.FileAlterationMonitor
Let’s explore our Apache listener:
What should be the program flow:
1. Create an implementation for Listener and implement event methods, whichever required
2. Create and Observer to observer on some path – let’s say (“/temp/”or C:/temp/)
3. Register our listener with this observer.
4. Start a Thread and register our observer with it (we call it Monitor)
5. Done
Code:
1. Listener:
import java.io.File;
import org.apache.commons.io.monitor.FileAlterationListener;
import org.apache.commons.io.monitor.FileAlterationObserver;
public class FileWatcherListenerUsingApache implements FileAlterationListener {
@Override
public void onDirectoryChange(File arg0) {
System.out.println("Directory changed " + arg0.getName() );
}
@Override
public void onDirectoryCreate(File arg0) {
System.out.println("Directory created " + arg0.getName() );
}
@Override
public void onDirectoryDelete(File arg0) {
System.out.println("Directory deleted " + arg0.getName() );
}
@Override
public void onFileChange(File arg0) {
System.out.println("File changed: " + arg0.getName() );
}
@Override
public void onFileCreate(File arg0) {
System.out.println("File craeted " + arg0.getName() );
}
@Override
public void onFileDelete(File arg0) {
System.out.println("File deleted " + arg0.getName() );
}
@Override
public void onStart(FileAlterationObserver arg0) {
System.out.println("Observation started for " + arg0.getDirectory().getAbsolutePath() );
}
@Override
public void onStop(FileAlterationObserver arg0) {
System.out.println("Observation stopped for " + arg0.getDirectory().getAbsolutePath() );
}
}
|
2. Observer, Monitor:
import java.io.File;
import
org.apache.commons.io.monitor.FileAlterationMonitor;
import
org.apache.commons.io.monitor.FileAlterationObserver;
/***
* It is used to monitor file system
activities on /temp/ directory
*
*
* @author Sushil
*
*/
public class
FileWatcherObserverUsingApache {
public static void main(String[]
args) throws Exception {
//create file to watch on
File dirToWatch=new File("/temp/");
// create alteration observer
on file
FileAlterationObserver observer=new
FileAlterationObserver(dirToWatch);
// register listener with
observer
observer.addListener(new
FileWatcherListenerUsingApache());
// create Monitor ( Thread )
final
FileAlterationMonitor monitor=new
FileAlterationMonitor();
// Register Observer with
Monitor
monitor.addObserver(observer);
// Start thread to observe on
/temp
System.out.println("Observation
started on :"+ dirToWatch.getAbsolutePath());
monitor.start();
//
System.out.println("PRESS
CNTL+C to stop");
Runtime.getRuntime().addShutdownHook(new Thread() {
public void run() {
try {
monitor.stop();
} catch (Exception e)
{
// TODO
Auto-generated catch block
e.printStackTrace();
}
}
});
}
}
|
Output:
1. When started:
2. Created a new empty file in temp - sushil.txt
3. Create a directory: sushil
4. Moved Sushil.txt into sushil directory:
No comments:
Post a Comment