He estado escribiendo un programa que mira un directorio y cuando se crean archivos en él, cambia el nombre y los mueve a un nuevo directorio. En mi primera implementación utilicé la API de Watch Service de Java, que funcionaba bien cuando estaba probando archivos de 1kb. El problema que surgió es que, en realidad, los archivos que se crean están en cualquier parte de 50-300mb. Cuando esto sucedió, la API de Watcher encontraría el archivo de inmediato, pero no pudo moverlo porque aún se estaba escribiendo. Traté de poner al observador en un bucle (lo que generó excepciones hasta que el archivo se pudiera mover) pero parecía bastante ineficiente.Java: viendo un directorio para mover archivos grandes
Como eso no funcionó, intenté usar un temporizador que verifica la carpeta cada 10 segundos y luego mueve los archivos cuando puede. Este es el método por el que terminé yendo.
Pregunta: ¿Hay alguna manera de indicar cuándo se está escribiendo un archivo sin hacer una comprobación de excepción o comparando continuamente el tamaño? Me gusta la idea de usar Watcher API solo una vez para cada archivo en lugar de verificar continuamente con un temporizador (y encontrar excepciones).
¡Todas las respuestas son muy apreciadas!
nt
'Intenté poner al observador en un bucle (lo que generó excepciones hasta que el archivo se pudiera mover) pero esto parecía bastante ineficiente. Sí, esta es una solución horrible. Las excepciones no están hechas para administrar el flujo de control. –
Tristemente @ntmp, por lo que he probado hasta ahora, buscar excepciones fue la mejor manera de decir que el sistema operativo aún estaba "escribiendo" o "copiando" el archivo. Pero estoy de acuerdo con @Sean Patrick Floyd en que es una manera terrible de hacerlo funcionar. Personalmente, me gustaría que el cheque formara parte de la API java.io.File. No estoy seguro de por qué no fue así. Quedaría en manos de los chicos de JVM implementarlo y hacerlo más fácil para nosotros los desarrolladores ... –
El enfoque de "verificar excepciones" ni siquiera funcionará en UNIX, ya que los sistemas de archivos UNIX no bloquean los archivos que se están escribiendo. En UNIX, java moverá felizmente el archivo parcialmente escrito, lo que dará como resultado datos dañados. – Raman