14/01/2012
Se añade a la interfaz JDirMonitor métodos que permiten consultar y obtener, a través del path absoluto, archivos que se encuentren dentro del directorio que se está analizando.
26/05/2012
Se añade en clase "cl.getsoftware.jdirmonitor.task.RecursiveTaskMonitor" capacidad de informar estado tanto de los archivos como de los directorios.
-----------------------------------------------------------------------------------------------------------------------
Hace unos días atrás se presentó un problema en un sistema y parte de la solución que se propuso involucraba leer información escrita en tiempo real desde múltiples archivos de bytes con objetos serializados, procesarlos y delegarlos a un sistema anexo, todo esto en Java.
Lo primero que se me ocurrió fue 'googlear' para encontrar una API que hiciera el trabajo de monitorear cambios en los archivos de un directorio y por alguna oscura razón no encontré nada...
Una vez solucionado el asunto me interesó la idea de crear una API lo suficientemente genérica, configurable y fácil de usar que solucionase dicho 'problema'.Y así nació JDirMonitor!
Entonces JDirMonitor es una API, bajo licencia LGPL que permite monitoriar y 'escuchar' los cambios que presentan todos los archivos que estén dentro de un directorio definido, avisando en su defecto cuáles han sido creados, modificados y eliminados.
Además de esto JDirMonitor posee las siguientes características:
-Definición de múltiples listeners para capturar eventos que suceden sobre los archivos.
-Definición de Filtros a aplicar sobre los archivos para, por ejemplo, discriminar cuáles deben procesarse.
-Definición de Comparators de objetos File para, por ejemplo, definir el orden en el que se deben procesar los distintos archivos.
JDirMonitor ofrece 2 tipos de monitoreos:
1) NormalTaskMonitor: analiza solamente los archivos que se encuentran en el primer nivel del directorio especificado.
2) RecursiveTaskMonitor: analiza todos los archivos que se encuentren dentro del directorio a analizar, es recursivo IN ORDEN, ya que accede a los archivos de todos los subdirectorios (en cualquier nivel de profundidad).
El siguiente código de ejemplo permite monitorear un directorio X con NormalTaskMonitor, un listener y un filtro de archivo:
import java.io.File;
import java.util.concurrent.TimeUnit;
import cl.getsoftware.jdirmonitor.DirectoryMonitor;
import cl.getsoftware.jdirmonitor.MonitorBuilder;
import cl.getsoftware.jdirmonitor.exception.DirectoryMonitorException;
import cl.getsoftware.jdirmonitor.filter.RegexNameFileFilter;
import cl.getsoftware.jdirmonitor.listener.FileListener;
import cl.getsoftware.jdirmonitor.task.NormalTaskMonitor;
public class Test {
public static void main(String[] args) throws DirectoryMonitorException {
String pathDirectory = "ruta/del/directorio/a/monitorear";
long timeTaskExecute = 2;
//Clase que permite añadir filtros a archivos y directorios
//mediante expresiones regulares
RegexNameFileFilter regexName =
new RegexNameFileFilter();
regexName.addFileNameRegex("[a-zA-Z].*?\\.txt$");
MonitorBuilder builder = new MonitorBuilder(pathDirectory,
timeTaskExecute, new NormalTaskMonitor(),
TimeUnit.SECONDS);
builder.addListener(fileListener);
builder.setFileFilter( regexName );
DirectoryMonitor monitor = builder.build();
monitor.start();
//se deja el hilo main vivo en un ciclo infinito
//para ver lo que imprimen los listeners en consola
while( true ){
try {
Thread.sleep(10000);
}
catch (InterruptedException e) {}
}
}
public static FileListener fileListener = new FileListener() {
@Override
public void fileDeleted(File file) {
System.out.println("Archivo " + file.getAbsolutePath() + " ha sido BORRADO");
}
@Override
public void fileCreated(File file) {
System.out.println("Archivo " + file.getAbsolutePath() + " ha sido CREADO");
}
@Override
public void fileChanged(File file) {
System.out.println("Archivo " + file.getAbsolutePath() + " ha sido MODIFICADO");
}
};
}
Así de simple, en 4 líneas tenemos corriendo un DirectoryMonitor que revisará el directorio periódicamente cada N segundos, nos informará a través del listener los cambios que ocurren en los archivos y con la clase cl.getsoftware.jdirmonitor.filter.RegexNameFileFilter se logra filtrar solo los archivos que posean un nombre que cumpla con la expresión regular definida.
Otra ventaja es que la API te permite codificar tus propias clases de monitoreo, las cuales deben heredar de la clase cl.getsoftware.jdirmonitor.AbstractTaskMonitor.
Por ejemplo, este es el código fuente de la clase cl.getsoftware.jdirmonitor.task.NormalTaskMonitor:
/* * JDirMonitor a listener of files * Copyright (C) 2010 GetSoftware Group * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * This library was written by Eugenio Contreras for GetSoftware Group * Contact email: contacto@getsoftare.cl */ package cl.getsoftware.jdirmonitor.task; import java.io.File; import cl.getsoftware.jdirmonitor.AbstractTaskMonitor; /** * <p>Tarea de monitoreo de directorio que analiza solamente los archivos que se * encuentran en el primer nivel del directorio especificado.</p> * * @author egacl * */ public class NormalTaskMonitor extends AbstractTaskMonitor { /** (non-Javadoc) * @see cl.getsoftware.jdirmonitor.AbstractTaskMonitor#monitorRutine(java.io.File) */ @Override public void monitorRutine(File directory) { this.normalRutine( this.getFilesOfDirectory(directory) ); } public void normalRutine( File []files ){ for( File file : files ){ if( file.exists() ){ if( file.isFile() ){ this.fileMonitor( file ); } } } } }El método monitorRutine se ejecuta cada vez que el DirectoryMonitor inicia la rutina de monitoreo y le envía como parámetro el objeto java.io.File del directorio a analizar. Por lo tanto allí puedes escribir la manera en que deseas realizar el monitoreo.
Puedes descargar el archivo JDirMonitor.rar (proyecto Eclipse con javadoc incluida).
Api JAR JDirMonitor.jar
EJEMPLO DE COMO UTILIZAR LA API AQUI