2010-05-07 25 views
46

Estoy intentando abrir un archivo en Android como esto:prueba si existe el archivo

try 
    { 
     FileInputStream fIn = context.openFileInput(FILE); 
     DataInputStream in = new DataInputStream(fIn); 
     BufferedReader br = new BufferedReader(new InputStreamReader(in)); 
     if(in!=null) 
      in.close(); 
    } 
    catch(Exception e) 
    { } 

, pero en caso de que el archivo no existe un archivo no encontrado es lanzada una excepción. Me gustaría saber cómo puedo probar si el archivo existe antes de intentar abrirlo.

+2

Si ese es su manejador de excepciones real, vuelva a pensarlo. http://www.rockstarprogrammer.org/post/2007/jun/15/empty-catch-blocks-are-always-wrong/ – Thomas

+0

@Thomas que solía ser mi controlador de excepciones para una cláusula como esta (copiado descifrar el 'Net.) Supongo que una buena regla para copiar es examinar todo antes de usarlo. Tengo suficientes problemas para usar mi propio código. –

Respuesta

26

La documentación dice Context.openFileInput o bien devuelve un (archivo encontrado) flujoEntrada o lanza una FileNotFoundException (no encontrado)

http://developer.android.com/reference/android/content/Context.html#openFileInput(java.lang.String)

Así que parece que la excepción es su "prueba".

También podría tratar de usar estándar

java.io.File file = new java.io.File(PATHTOYOURCONTEXT , FILE); 
if (file.exists()) { 
    FileInputStream fIn = new FileInputStream(file); 
} 

Pero eso no es recomendable. Context.openFileInput() y Context.openFileOutput() se aseguran de que permanezca en el contexto de almacenamiento de las aplicaciones en el dispositivo, y que todos sus archivos se borren cuando se desinstala la aplicación .

+0

funciona bien para comprobar si existe un archivo de destino en la tarjeta SD. ¡Gracias! – mishkin

+0

muy, muy gracias :) –

+0

¿Por qué no se recomienda? –

2

¿por qué no coges la excepción FileNotFound y lo tomas porque el archivo no está presente?

+0

Esa es la forma en que realmente lo hago, pero me preguntaba si hay otra forma de – rantravee

+0

@rantravee: la forma en que lo hace es atrapar todas las excepciones. Además de ser un poco descuidado, tampoco te dice por qué ocurrió la excepción.Si capturas simplemente 'FileNotFoundException', sabrás cuando lo hayas detectado que fue lanzado porque el archivo no existe (en lugar de la Excepción genérica que podría significar que algo salió mal con alguna llamada en algún lugar de tu bloque de prueba o las cosas llama, o lo que llama llamadas, o ...) – cHao

+0

En general, es mejor si las excepciones son solo eso, excepciones. Verifique si el archivo existe o no, y si después de haberlo creado todavía no existe, mantenga el try/catch como un retroceso. – SK9

160

Creo que la mejor manera de saber si un archivo existe, sin realmente intentar abrirlo, es el siguiente:

File file = getContext().getFileStreamPath(FILE_NAME); 
if(file.exists()) ... 

Espero que ayude, adiós!

+0

Funciona, y supongo que es más eficiente que obtener un InputStream solo para ver si el archivo existe. Bonito. –

+5

¿Qué sucede si FILE_NAME = nombre de archivo + ruta? –

+0

¿qué quieres decir? FILE_NAME debe ser una ruta de archivo relativa al directorio privado (desconocido) de su aplicación. El hecho de que FILE_NAME contenga subdirectorios no es un problema para probar su existencia; si tiene que crear ese archivo, puede garantizar los subdirectorios necesarios, como es habitual en Java, [consulte los documentos] (http://developer.android.com/reference/java/io/File.html#mkdirs()) – lencinhaus

0

Si desea abrir un archivo en cualquier caso (es decir, si no existe crear uno nuevo, si no anexe a la anterior) se puede usar esto, hay pruebas necesarias:

public static void write_custom_log(String message){ 
     File root = Environment.getExternalStorageDirectory(); 
     try{ 
      BufferedWriter fw = new BufferedWriter(new FileWriter(new File("/mnt/sdcard/tjb_tests/tjb_log_file.txt"),true)); 

      if (root.canWrite()){ 
       fw.write(message); 
       fw.close(); 
       } 
      } catch (IOException e) { 
       Log.e("One", "Could not write file " + e.getMessage()); 
      } 
    } 
-2

Mi sugerencia es verificar la longitud del archivo. if file.length() returns 0 eso significa que el archivo no existe.

+9

Puede haber un archivo con longitud 0 – AaA

5

Con el estándar java.io.File Esta es la función que he creado, y funciona correctamente:

private static final String APP_SD_PATH = "/Android/data/com.pkg.myPackage"; 
... 
public boolean fileExistsInSD(String sFileName){ 
    String sFolder = Environment.getExternalStorageDirectory().toString() + 
      APP_SD_PATH + "/Myfolder"; 
    String sFile=sFolder+"/"+sFileName; 
    java.io.File file = new java.io.File(sFile); 
    return file.exists(); 
} 
+0

Context.getExternalFilesDir() devuelve lo mismo que Environment.getExternalStorageDirectory(). ToString() + APP_SD_PATH – riper

1

Si desea asegurarse de que existe un archivo (es decir, si no existe crear uno nuevo, si no entonces no borrarlo) a continuación, utilizar File.createNewFile:

https://docs.oracle.com/javase/7/docs/api/java/io/File.html#createNewFile()

por ejemplo,

{ 
     String pathName = <file path name> 
     File file = new File (pathName); 
     Uri pathURI = Uri.fromFile (file); 
     boolean created; 

     String mIOException = ""; 
     String mSecException = ""; 

     try 
     { 
      created = file.createNewFile(); 

      if (created) 
      { 
       ctxt.sendBroadcast (new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, pathURI)); 
      } 
     } 
     catch (IOException ioex) 
     { 
      mIOException = ioex.getMessage(); 
     } 
     catch (SecurityException sex) 
     { 
      mSecException = sex.getMessage(); 
     } 

} 
Cuestiones relacionadas