2009-11-02 17 views
13

FileNotFoundException se lanza en todo tipo de ocasiones, no necesariamente solo cuando el nombre del archivo no es válido, sino también cuando e. gramo. permisos no permiten que un archivo se crea o se lee:Detectar causa subyacente para java.io.FileNotFoundException

java.io.FileNotFoundException: \\server\share\directory\test.csv (Anmeldung fehlgeschlagen: unbekannter Benutzername oder falsches Kennwort) 
    at java.io.FileOutputStream.open(Native Method) 
    at java.io.FileOutputStream.<init>(FileOutputStream.java:179) 
    at java.io.FileOutputStream.<init>(FileOutputStream.java:131) 
    at java.io.FileWriter.<init>(FileWriter.java:73) 

El ejemplo anterior muestra una alemana de Windows quejándose de nombre de usuario o contraseña no válidos.

¿Hay alguna forma de analizar el mensaje de excepciones para obtener información un poco más fina en por qué exactamente se produjo la excepción? El problema con el análisis de mensajes es que en diferentes lugares los mensajes variarán.

Respuesta

10

Realice la comprobación de permisos de existencia de archivos/lectura usted mismo antes de crear FileOutputStream.

File test_csv = new File("\\server\share\directory\test.csv"); 

if (test_csv.exists() && test_csv.canWrite()) 
{ 
    // Create file writer 
    ... 
} 
else 
{ 
    // notify user 
    ... 
} 

en cuenta que a veces se tendrá que comprobar los permisos de lectura/escritura en una matriz de que el archivo de destino, si es necesario crear un nuevo archivo.

File test_csv = new File("\\server\share\directory\test.csv"); 
File parent_dir = test_csv.getParentFile() 

if (parent_dir.exists() && parent_dir.canWrite()) 
{ 
    // Create file writer 
    ... 
} 
else 
{ 
    // notify user 
    ... 
} 
+0

D'Oh! A veces la vida puede ser tan fácil. Gracias por abrir mis ojos a lo obvio. –

+1

Ten cuidado. Aparentemente hay algunos errores que pueden afectar el resultado de retorno de estos métodos. Puede obtener resultados no válidos si su directorio es un directorio personalizado o de sistema o si está en ciertos tipos de recursos compartidos de red. –

+0

Aparentemente acabo de recibir un bit de http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4939819 que le dirá que el directorio de inicio del usuario (documentos y configuraciones ...) en Windows no se puede escribir. Solución alternativa: intente crear un archivo temporal en la carpeta principal y elimínelo inmediatamente después, si tiene éxito. Si se lanza una IOException, realmente no puede escribir. –

1

Un enfoque es observar el tipo real de la excepción: como se puede ver en el docs, hay muchas subclases que proporcionan información de grano más fino.

Sin embargo, probablemente no llegue muy lejos con eso. Al igual que con la mayoría de las excepciones comprobadas, generalmente es mejor registrar/informar la excepción y pedirle al usuario opciones sobre cómo corregirla.

+0

Problema es que recibo una excepción FileNotFoundException, no una IOException genérica. Me gustaría presentar un mensaje de usuario mejor que "Archivo no encontrado" o "Error genérico", señalando al usuario hacia el problema de permiso ... –

+0

Mi error - He leído IOException. Desafortunadamente, las excepciones de Java rara vez tienen información adicional (como un código de error POSIX) y en muchos casos se amplían para cubrir condiciones que tienen poca relación con su nombre (a veces debido a la asignación del código POSIX al tipo de excepción, a veces, creo, debido a la pereza). – kdgregory

2

Es posible que desee ver las propiedades del archivo utilizando el objeto java.io.File antes de intentar leer el archivo. Hay un método canRead que puede usar para determinar si el usuario puede o no leer el archivo.

Cuestiones relacionadas