Cómo detectar si un fichero ha sido creado, modificado o borrado utilizando Java

Java

Desde hace tiempo estamos acostumbrados a que nuestros IDEs y otros gestores de archivos nos avisen cuando un fichero ha cambiado.

La razón del cambio puede ser desde la modificación o creación del fichero, hasta el borrado del mismo.

La forma más eficiente de conseguir esto es recibiendo los eventos de estas situaciones directamente del sistema nativo de notificación de eventos del SO.

Pues bien, desde Java podemos conseguir este comportamiento utilizando la interface WatchService.

Veamos en qué consiste

Para empezar partimos de un directorio sobre el que queremos ser notificados de eventos que se produzcan sobre él. Partimos entonces de un objeto que implementa la interface

  • java.nio.file.Watchable.

como es el caso de los objetos de tipo

  • java.nio.file.Path.

Y partimos de los tipos de eventos que queremos ser notificados, como son los

  • StandardWatchEventKinds.ENTRY_CREATE
  • StandardWatchEventKinds.ENTRY_DELETE
  • StandardWatchEventKinds.ENTRY_MODIFY
  • StandardWatchEventKinds.OVERFLOW

Entonces creamos el objeto Watchable y le registramos el servicio WatchService junto con los eventos en los que estamos interesados.

Este proceso de registro devuelve un objeto WatchKey, que es sobre el que recibiremos todos los eventos que se produzcan. Todos los eventos que se produzcan serán encolados en este objeto y los recibiremos utilizando el método poll() o take() del servicio WatchService.

  • poll()
  • take()

Ambos recuperan el WatchKey con los eventos producidos. La diferencia entre ambos métodos es que take() espera a que exista al menos un WatchKey con eventos, mientras que poll() si no hay ninguno devolvería null.

Una vez hemos procesado todos los eventos encolados en el WatchKey debemos resetearlo para que pueda seguir recibiendo y encolando más eventos.

En el caso de que un sistema de ficheros sea más rápido informando de los eventos que la implementación que los procesa, cuando procesemos dichos eventos a través del WatchKey recibiremos un evento del tipo OVERFLOW.

El servicio WatchService se puede utilizar de forma concurrente por varios consumidores. El único cuidado que tenemos que tener en estos casos es llamar al método reset() solo después de que sus eventos del WatchEvent hayan sido todos procesados.

Finalmente llamaremos al método close() del servicio WatchService para finalizar con la monitorización del directorio en el que estábamos interesados.

Código de ejemplo

Sigue leyendo

iftop. Análisis y monitorización del tráfico de red

iftop

En los sistemas unix existen diversos comandos de monitorización y análisis del tráfico de red que nos ayudan a analizar en un momento determinado el estado de nuestra red y el tráfico generado por nuestras aplicaciones. Algunos de estos comandos son los siguientes:

  • iftop
  • iptraf
  • nethogs
  • bmon
  • tcptrack
  • vnstat
  • bwm-ng
  • pktstat
  • trafshow

Muchos de ellos analizan y presentan la misma información utilizando distintos formatos, por lo que al final terminaremos utilizando casi siempre los mismos comandos. Mencionar que estos comandos son especialmente útiles en momento puntuales, ya que habitualmente existen herramientas más completas y con una interface gráfica mas sencilla de manejar. La última vez que utilizamos este comando iftop (entre otros) fue para detectar una vulnerabilidad o exploit en un VPS (Virtual private Server) donde comenzamos a notar lentitud en las conexiones ssh y un aumento significativo del tráfico de red.

Sigue leyendo