example ejemplo create android filenotfoundexception fileoutputstream

android - ejemplo - fileoutputstream java



¿Por qué en algún momento arroja FileNotFoundException? (6)

El código funciona la mayor parte del tiempo, pero en algún momento produce una excepción. No se pudo averiguar qué podría causarla.

Lo que hace es crear un archivo en

/storage/emulated/0/Download/theFileName.jpg

y escriba datos en él (de sourceFile que existe), pero obtuvo la excepción de "archivo no existe" para el archivo recién creado.

(Tiene uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE", and uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE " en el manifiesto).

File sourceFile = new File(theSourceFileFullPath); if (sourceFile.exists()) { File downloadDirectory = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS); String downloadPath = downloadDirectory.getPath(); String newFilePath = (downloadPath + "/" + fileName); File newFile = new File(newFilePath); try { FileInputStream in = new FileInputStream(sourceFile); // ava.io.FileNotFoundException: // /storage/emulated/0/Download/theFileName.jpg: open failed: ENOENT (No such file or directory) // exception at this line FileOutputStream out = new FileOutputStream(newFile); //...... } catch (Exception e) {} }


  1. El problema puede ocurrir debido a la forma en que creas el archivo:

    String downloadPath = downloadDirectory.getPath(); String newFilePath = (downloadPath + "/" + fileName); File newFile = new File(newFilePath);

    El código peligroso está aquí:

    String newFilePath = (downloadPath + "/" + fileName);

    En su lugar, trate de utilizar el siguiente enfoque:

    File newFile = new File(downloadDirectory, fileName);

  2. Disponibilidad de la tarjeta SD: consulte la siguiente documentación http://developer.android.com/training/basics/data-storage/files.html#WriteExternalStorage . Puede ser que los medios no estén montados (por ejemplo, en algunos dispositivos antiguos sucede cuando el usuario conecta el dispositivo a la computadora a través de usb) Por lo tanto, intente verificar si los medios están montados:

    /* Checks if external storage is available for read and write */ public boolean isExternalStorageWritable() { String state = Environment.getExternalStorageState(); if (Environment.MEDIA_MOUNTED.equals(state)) { return true; } return false; }

    y notificar al usuario si no.


De acuerdo con los documentos de Java - Class FileNotFoundException :

public class FileNotFoundException extends IOException

Indica que un intento de abrir el archivo indicado por una ruta de acceso especificada ha fallado.

Esta excepción será lanzada por los FileInputStream , FileOutputStream y RandomAccessFile cuando no exista un archivo con la pathname especificada. Estos constructores también lo lanzarán si el archivo existe, pero por algún motivo es inaccesible, por ejemplo, cuando se intenta abrir un archivo de solo lectura para escribir.

Para reanudar, hay tres casos en los que se puede FileNotFoundException una FileNotFoundException .

  1. El archivo nombrado no existe.
  2. El archivo nombrado es en realidad un directorio.
  3. El archivo nombrado no se puede abrir para leer por alguna razón.

tiene la excepción "archivo no existe" para el archivo recién creado.

En tu código no veo dos cosas.

  1. Eliminar el archivo después de la escritura exitosa. No estoy bromeando en absoluto. Si tuviera una clase como esta y ese error, haría una especie de prueba, que terminaría con la eliminación de downlaodDirectory después de copiar el contenido del archivo de origen. En ese caso, pasaría el método o recibiría otro error, pero más específico, como en mis palabras: no se puede eliminar el archivo. Debajo de usarlo
  2. Archivo de cierre después de escribir datos. No veo también un método para cerrar archivos. En su código, parece ser que su archivo aún está abierto, por lo que vuelve a ejecutar una aplicación y obtiene este error imprevisible.

Para solucionar el problema, simplemente cierre ambos archivos después de procesar los datos utilizando el método file.close() .

Espero te ayude


Espero que su código para escribir datos en el archivo sea perfecto. Solo estoy concentrado en su problema. Creo que hay dos posibilidades de obtener el archivo no encontrado Excepción.

  1. En algún momento, el nombre del archivo no es compatible Algunos caracteres especiales Mientras proporciona este tipo de carácter para dar el nombre del archivo en ese momento, el archivo no se genera correctamente. Por eso se produjo este error. Asegúrese de que el nombre del archivo sea el correcto.
  2. la segunda es su extensión de archivo. Aquí no se especifica qué tipo de archivo tiene.

Aquí tengo un fragmento de código. Espero que esto te ayude a resolver el problema.

Solución

File file=new File(Environment.getExternalStorageDirectory()+"/"+ConstansClass.FOLDERNAME); if(!file.exists()) { file.mkdir(); } String file=filename.replaceAll("[^a-zA-Z0-9.-]", " "); yourDir = new File(file, file+".mp3"); if(yourDir.exists()) { return yourDir; }

Editar

Lo siento lannf No sé qué sucede exactamente en su código, pero tengo un fragmento de código que es simplemente descargar el archivo mp3 de soundcloude y Store en mi almacenamiento local. Creo que es exactamente lo mismo que su requerimiento. código abajo

@Override protected File doInBackground(Void... params) { //File sdCardRoot = Environment.getExternalStorageDirectory()+"/Music"; File file=new File(Environment.getExternalStorageDirectory()+"/"+ConstansClass.FOLDERNAME); if(!file.exists()) { file.mkdir(); } String filename=soundCloudeResponse.getTitle();//.replaceAll("[^a-zA-Z0-9.-]", " "); yourDir = new File(file, filename+".mp3"); if(yourDir.exists()) { return yourDir; } String url=soundCloudeResponse.getStream_url()+"?"+ConstansClass.SOUNDCLOUDE_CLIENT_ID; URL u = null; try { DebugLog.e("Request Url"+ url); u = new URL(url); URLConnection conn = u.openConnection(); int contentLength = conn.getContentLength(); DataInputStream stream = new DataInputStream(u.openStream()); byte[] buffer = new byte[contentLength]; stream.readFully(buffer); stream.close(); DataOutputStream fos = new DataOutputStream(new FileOutputStream(yourDir)); fos.write(buffer); fos.flush(); fos.close(); DebugLog.d("Download Complete in On Background"); } catch (MalformedURLException e) { sucess=false; e.printStackTrace(); } catch (IOException e) { sucess=false; e.printStackTrace(); } catch (Exception e) { sucess=false; e.printStackTrace(); DebugLog.e("Error ::"+e.getMessage()); } return yourDir; }

Creo que eres un desarrollador inteligente, por lo que puedes modificar este código de acuerdo con tus requisitos.

La mejor de las suertes


Podría haber una posibilidad más:

Si una parte de su código está escribiendo el archivo y otra está leyendo, entonces es bueno considerar que el lector está leyendo antes de que el escritor termine de escribir el archivo.

Puede cotejar este caso poniendo su código en modo de depuración. Si funciona bien allí y le da la excepción FileNotFoundException, seguramente esta podría ser la razón potencial de esta excepción.

Ahora, cómo resolver:

Puedes usar un mecanismo de reintento similar al siguiente bloque de código

if(!file..exists()){ Thread.sleep(200);}

en su código y cambie el valor de reposo de acuerdo a sus necesidades.

Espero que ayude.!!


Puedo pensar en las siguientes posibles razones para este comportamiento:

  1. El nuevo archivo no se pudo crear simplemente porque no hay espacio libre en la tarjeta SD. La próxima vez que encuentre este problema, intente ver si tiene al menos algo de espacio disponible a través del administrador de archivos o Configuración -> Almacenamiento. Dudo que pueda hacer algo al respecto si esto es lo que sucede en el dispositivo de su usuario.
  2. La tarjeta SD no está disponible debido a algún problema en el sistema operativo o no está físicamente conectada, por lo que no se pudo crear el archivo. Una vez más, no hay nada que puedas hacer al respecto, aparte de mostrar un mensaje de error con Toast .
  3. ¿Cómo se genera la parte fileName de la ruta de su archivo? Sometimes los archivos no se pueden crear porque el nombre de archivo contiene caracteres no compatibles (por este dispositivo en particular). Por ejemplo, tengo HTC Desire X con Android 4.1.2 que no puede crear archivos con el código similar al suyo si el nombre del archivo contiene dos puntos. Pruebe otra forma de generar el nombre de archivo y ver si hace una diferencia.
  4. ¿Se aseguró de que el directorio de Downloads exista antes de crear el archivo dentro de él? Escribe algo como lo siguiente:

    if (!downloadDirectory.exists()) { downloadDirectory.mkdirs(); }

  5. El permiso WRITE_EXTERNAL_STORAGE se considera dangerous en el Android 6, por lo que el usuario puede WRITE_EXTERNAL_STORAGE en cualquier momento. Asegúrese de que el usuario no haya revocado este permiso antes de escribir en el archivo.
  6. Siempre cierre el flujo de E / S cuando termine de trabajar con él. Agregue la cláusula finally a su bloque try-catch y cierre out secuencias dentro y out de él:

    finally { if (in != null) { try { in.close(); } catch (Exception e) { } } if (out != null) { try { out.close(); } catch (Exception e) { } } }

  7. El último - y finalmente me quedé sin opciones. :) Supongo que este problema también podría surgir si escribes en el mismo archivo desde varios subprocesos. Si ese es el caso, intente sincronizar el acceso a su código de escritura de archivos.

no publicaste seguimientos completos de la pila de excepciones pero encontré el problema exacto resuelto por SO.

java.io.FileNotFoundException: /storage/emulated/0/bimagechooser/1429031333305.jpg: open failed: ENOENT (No such file or directory)

Utilice esta biblioteca de selección de image-chooser-library. y necesidad de re-factorizar el código.

El chico coomar2841 . seguramente te ayudará. A medida que pasa horas resolviendo el problema. así que ahorra tiempo.

Tomó las fuentes de com.kbeanie.imagechooser y las introdujo en su aplicación, eliminó la declaración de gradle de la biblioteca y la aplicación debería funcionar.

por favor vea el tema de GitHub

Espero que te funcione. :)