2010-09-30 24 views
6

Nunca pensé que iba a pasar a mí, pero me encontré con mi primer error en Java:alternativa a File.Exists() en Java

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=5003595

estoy más o menos en la misma situación exacta como se describe en el error (NFS en Linux), y veo que File.exists() no devuelve el valor correcto (al menos no de inmediato).

Entonces mi pregunta es, ¿hay alguna alternativa a este método de verificar si existe un archivo? Preferiría mantenerlo OS agnóstico si es posible.

EDIT: He encontrado una solución. Si realiza una llamada a 'ls $ filedir', el NFS actualizará cualquier caché/metadata que esté dando problemas a Java, y File.exists() devolverá el valor correcto. Por supuesto, esto no es totalmente ideal, ya que perjudica la portabilidad, pero hay formas de lidiar con ese problema.

Gracias, -Ben

+0

¿Qué tipo de archivo es? ¿Estás buscando un tipo particular de archivo? ¿O simplemente cualquier archivo? Puede ejecutar System.exec ("ls") y analizar los resultados de su archivo. Aunque estoy seguro de que hay formas más fáciles, lo dejo como un comentario – Falmarri

+0

Este error es específico de Java 1.4.2_03, que llegó al final de su ciclo de vida de soporte años atrás. Por curiosidad, ¿por qué no simplemente migrar a Java 5 o superior? ¿Has intentado probar con un JRE compatible para ver cualquier interrupción? –

+1

@Steve: estoy ejecutando Java 6. Supongo que, dado que marcaron "no se corregirá" para este error, no está solucionado en ninguna versión de Java. Al menos, eso es lo que me dice el comportamiento de mi aplicación. – Ben

Respuesta

5

El problema básico que tiene con NFS es que almacena información de atributos, archivos y directorios. Esto significa que la información puede estar desactualizada. Es posible que pueda desactivar el almacenamiento en caché, verá una reducción significativa en el rendimiento.

Lo importante a recordar es que NFS no es un servicio de mensajería y no está diseñado para la entrega oportuna de datos.

+1

Esto es lo más cercano a una respuesta que puedo marcar. El problema realmente está más cerca del hecho de que se está utilizando un NFS. En mi situación, se crea un archivo con el nombre de archivo x.file, luego se borra y luego se vuelve a hacer con el mismo nombre (archivo x.file). Después de que se rehaga, las llamadas a stat en el archivo afirman que no existe. Llamar a 'ls' en todo el directorio parece actualizar el caché y solucionar el problema de archivo .exists() de Java, y las llamadas a stat también comienzan a regresar correctamente. Esto parece indicar que el problema tiene más que ver con NFS que con Java. – Ben

4

Todo File.exists te dice es si el archivo existe en algún momento en el pasado. No te dice:

  • Si va a existir cuando se intenta abrirlo
  • si tiene permiso para abrirlo
  • nada útil en absoluto, realmente

Así que trate para diseñar su aplicación para que pueda manejar archivos que no existen sin intentar verificarlo con anticipación. (Tendrá que manejar varias excepciones cuando realmente trabaje con el archivo.)

+1

Estás asumiendo que voy a abrir el archivo más tarde, lo que no es cierto en mi situación particular. En realidad, no termino de abrir el archivo en mi aplicación; Estoy revisando la existencia por otros motivos. – Ben

5

¿Qué ocurre si File.exists() devuelve verdadero, luego alguien elimina el archivo/su montaje NFS desaparece, y luego intenta abrir el archivo? Básicamente, File.exists() es inútil ya que necesita manejar las excepciones que pueden surgir al abrir el archivo de todos modos.

1

La alternativa obvia es File.isFile(). Intenta eso primero.

Aunque se volverá impreciso al leer archivos de solo lectura, siempre se puede usar File.canWrite() para verificar si el archivo existe.

Si las dos opciones anteriores fallan, podría usar File.length(). Si devuelve 0L, sabrá que el archivo no existe.

+0

¿O es un archivo vacío? – gastaldi

2

Observé que el método java.nio.file.Path.exists() de Java 7 devuelve falso si el archivo no existe o su existencia no puede determinarse. Parece, por lo tanto, que los falsos negativos estarán disponibles por un tiempo y que su código deberá tolerarlos.

6

Tuve el mismo problema y lo resolví con una llamada al file.getParentFile().list(). Esencialmente lo mismo que su solución, pero agnóstico del sistema operativo.

+0

¡Buena contribución! – Ben

+0

¿POR QUÉ funciona? –