Si trabaja con archivos o informes y necesita automatizar un proceso, siempre se preguntó cuál es la manera eficiente de automatizar el proceso. Al estar en finanzas, experimenté esto y me preguntaba si hay una biblioteca disponible para evitar escribir código repetitivo. El observador de archivos al rescate, pero espera, ¿qué es un observador de archivos y cómo funciona? Para cualquier File Watcher necesitamos tres cosas:
- Oyente: escuchar un evento como crear, actualizar, eliminar
- Observer: en un directorio o ruta, configure el observador para buscar cualquier evento que ocurra en esa ruta y llamará al método correspondiente del oyente.
- El último Monitor es un subproceso activo que tendrá este observador ejecutándose dentro de él para cualquier evento.
The Observer es un patrón de diseño de comportamiento en Java que especifica la comunicación entre objetos: observables y observadores. Un observable es un objeto Java que notifica a los observadores sobre los cambios en su estado o escucha cualquier evento. Veamos su teoría y sus implementaciones.
NIO de Java
El paquete java.nio.file proporciona la API Watch Service que busca cambios en los archivos de un directorio determinado. Para implementar el servicio de vigilancia, estos son los pasos que debe seguir:
- Crear un WatchService para el sistema de archivos – Listener
- Registra un directorio con un observador que deseas monitorear y define qué evento te interesa – Observador
- Implemente un bucle para esperar eventos entrantes. Siga comprobando a intervalos regulares cualquier evento nuevo. La cola de un observador se utiliza para agregar cualquier evento definido que ocurra. Procese el evento a medida que llegue y ejecute el código: monitor.
¿Cuándo debemos usar Watch Service API?
Las aplicaciones que se preocupan por los cambios de eventos, como el editor y el IDE, usan esta API. La implementación en caliente de código en IDE podría potencialmente usar este servicio. La API de WatchService está impulsada por los eventos que tienen lugar a nivel del sistema operativo. Recoge todos los eventos en el búfer del sistema. Si hay una gran cantidad de archivos que se eliminan o actualizan, existe la posibilidad de que el búfer del sistema operativo se desborde. Si la aplicación no puede procesar los eventos lo suficientemente rápido, algunos de ellos se pierden o descartan antes de que la aplicación pueda leerlos. Para manejar esta situación, necesitamos implementar un límite de velocidad en el sistema que le dará tiempo de búfer para manejar ráfagas de actividad para evitar DESBORDAMIENTO. Esta API no está diseñada para indexar una unidad de almacenamiento. La mayoría de los sistemas de archivos admiten el cambio de archivos de forma nativa como parte de su implementación. La API de Watch Service usa esta función para escuchar los eventos enviados por el sistema operativo. Sin embargo, cuando un sistema de archivos no brinda soporte a este mecanismo de forma nativa, podemos configurar un mecanismo de sondeo para escuchar eventos.
Apache Commons
org.apache.commons.io es un paquete de utilidades para trabajar con secuencias, lectores, escritores y archivos. Para usar esta implementación:
- Cree implementaciones de FileAlterationListener que procesen eventos en el archivo/directorio como crear, cambiar y eliminar eventos
- Registre los agentes de escucha con un FileAlterationObserver para el directorio o la ruta.
- Registre el(los) observador(es) con un FileAlterationMonitor que monitoreará el observador del directorio
La biblioteca Commons IO no se basa en los eventos del sistema operativo y, por lo tanto, no hay posibilidad de desbordamiento. En cada encuesta, el observador obtiene la lista de archivos usando listFiles() de File Class en el directorio y la compara con la lista obtenida de la encuesta anterior.
- Si se encuentra un archivo en la última encuesta, se invoca onFileCreate() en el oyente
- Si falta un nombre de archivo encontrado en la encuesta anterior en la lista de archivos obtenida de la última encuesta, se invoca onFileDelete() en el oyente
- Si se encuentra una coincidencia, se comprueba el archivo en busca de cambios en los atributos, como la fecha de la última modificación, la duración, etc. En este caso, se invoca onFileChange() en el oyente.
Vamos a crear un ejemplo, primero necesitamos un observador para el directorio y registrar los oyentes:
Java
File directory = new File(new File("."), "test"); FileAlterationObserver observer = new FileAlterationObserver(directory); observer.addListener(this);
Luego, registre el observador con un Monitor, que crea un nuevo hilo, invocando al observador en el intervalo especificado:
Java
long pollInterval = 100 FileAlterationMonitor monitor = new FileAlterationMonitor(pollInterval); monitor.addObserver(observer); monitor.start(); ....monitor.stop();
El oyente tendrá la lógica de procesamiento del archivo, en este caso, digamos que anulamos onFileCreate()
Java
@Override public void onFileCreate(final File newFile) { .. .. }
El monitoreo de Apache commons utiliza un mecanismo de sondeo, en el intervalo fijo el algoritmo verifica si hay nuevos eventos. Funciona muy bien en plataformas Unix y Windows y es compatible con unidades de red. Según mi experiencia, el servicio de vigilancia de JDK se complica con las unidades de red. Es eficiente incluso con grandes volúmenes de archivos. Dado que sondea y llama a listFiles() después de cada intervalo de sondeo, ocupará ciclos de CPU innecesarios, si el flujo de entrada del archivo de entrada no es alto. Un intervalo de sondeo correcto puede ayudar hasta cierto punto, pero el uso del ciclo de la CPU es alto en comparación con JDK WatchService. JDK WatchService, por otro lado, se basa en eventos, por lo que no se requiere sondeo. Se basa en el mecanismo de eventos del sistema operativo para desenstringr eventos, por lo que se requiere menos CPU. Según la velocidad a la que se modifican los archivos o se activan los eventos, se determina el uso de la CPU.
Diferencia entre Apache Commons y Java NIO
Apache Commons |
NIO de Java |
---|---|
El monitoreo de Apache commons utiliza un mecanismo de sondeo, a intervalos fijos el algoritmo verifica si hay nuevos eventos. | JDK WatchService no necesita sondeo, está basado en eventos. |
Es útil cuando los archivos grandes se eliminan con frecuencia. | La API de Watch Service está diseñada para aplicaciones que necesitan recibir notificaciones sobre eventos de cambio de archivos. Es muy adecuado para cualquier aplicación, como editor o ID. |
Funciona muy bien en plataformas Unix y Windows y es compatible con unidades de red. | No admite unidades de red. |
Utiliza ciclos de CPU cada vez que sondea. | JDK WatchService se basa en el mecanismo de eventos del sistema operativo, por lo que no se requiere sondeo. |
Puede manejar archivos enormes. | Según la velocidad a la que se modifican los archivos o se activan los eventos, se determina el uso de la CPU. Si hay un montón de eventos que ocurren en una ráfaga, puede provocar un desbordamiento de eventos. |