2011-06-23 13 views
11

Nuestro programa java escribe algunos datos importantes en un archivo continuamente. Ahora queremos arrojar alguna excepción o mostrar algún tipo de mensaje de error en la consola cuando el usuario borre el archivo (al que está escribiendo el programa java).Java: cómo detectar la eliminación de archivos mientras se escribe en un archivo?

me encontré con que java no lanza ninguna excepción cuando se intenta escribir en un archivo que se ha suprimido.

Método I - Comience un nuevo hilo que seguirá comprobando si el archivo está allí y notificará al programa principal de Java cuando se haya eliminado el archivo. Esto no funcionará en nuestro caso, ya que tendremos varios archivos en los que se escribirá el programa java, por lo que iniciar un nuevo hilo para cada archivo no será eficiente desde el punto de vista de la memoria.

Método II - comprobar la existencia del archivo cada vez justo antes de escribir en el archivo. Tampoco es un buen enfoque porque verificar la existencia del archivo es una operación más costosa.

Método III - Extender java.io.FilterWriter (que estamos utilizando para escribir en un archivo) y anular escritura() método para lanzar una excepción cuando se intenta escribir en un archivo que ha sido borrado Esta parece ser una buena solución, pero no pude encontrar ningún lugar donde Java esté digiriendo alguna excepción (cuando intenta escribir en un archivo que ha sido eliminado) que podemos arrojar al anular ese método.

+0

¿Es esto Windows o Unix? ¿Estás cerrando el archivo después de cada escritura, o dejándolo abierto todo el tiempo que estás corriendo? – Gabe

+0

@Gabe Es Unix. En Windows, no puede eliminar un archivo si lo está utilizando algún proceso. –

+0

En Unix no hay manera de saber que un archivo que tiene abierto ha sido eliminado, por lo que no hay forma de que Java (o cualquier otro idioma) arroje una excepción cuando eso suceda. – Gabe

Respuesta

1

Los FileChannel y FileLock clases podrían ser útiles en este caso.

ver How can I lock a file using java (if possible)

+0

¿El bloqueo como se describe de alguna manera impide que se elimine el archivo bloqueado? – Gabe

+1

@Gabe: parece que el bloqueo en Unix/Linux es solo de carácter consultivo y no impide eliminar el archivo de otros procesos. – splash

+0

A veces, el bloqueo es obligatorio (no se puede usar la parte del archivo que está bloqueada), pero incluso así no creo que impida que elimine el archivo bloqueado. – Gabe

1

En Unix, hay archivos y directorios existen. Un archivo puede aparecer en tantos directorios como desee, y un archivo abierto puede estar en el disco pero no aparecer en ningún directorio. Si se elimina un archivo de un directorio que es un cambio en el directorio, no en el archivo.

Para determinar si el directorio ha cambiado, es necesario sondear su camino con File.Exists(). Java 7 tiene un Directory Watcher que puede evitar la necesidad de sondeo.

+1

+1 por mencionar DirectoryWatcher en Java7 –

1

En primer lugar, dudo, que Java no lanzar una excepción si se intenta escribir en un archivo que falta. Lo que puede ocurrir es que bajo UNIX el archivo se elimina por el usuario, pero el proceso todavía escribe en un archivo de copia de seguridad (propia copia)

Tome un vistazo a los bienes comunes de Apache io paquete de monitor de archivo: http://commons.apache.org/proper/commons-io/apidocs/org/apache/commons/io/monitor/package-summary.html Básicamente, se puede registrar oyentes para diferentes eventos (eliminación de archivos, eliminación de directorio, etc.) y el oyente.

Si desea evitar el borrado voy a echar un vistazo a los comentarios de @splash. Otra opción es escribir en un archivo oculto en un directorio temporal propio.

+0

+1 ... ¿qué comentario de splash está hablando? –

+0

el que tiene FileLock – peshkira

-1
  1. En Unix, Linux, Solaris, MacOS, HP/UX, AIX, etc, no hay manera posible detectar que un archivo abierto ha sido eliminado.

  2. En Windows es imposible eliminar un archivo abierto.

Por lo tanto, su pregunta no tiene una respuesta aparente.

Cuestiones relacionadas