Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Por qué alguna vez lanza FileNotFoundException

El código funciona para la mayoría de las veces, pero alguna vez se lanza excepción. No pude averiguar qué podría causarlo.

Lo que hace es crear un archivo en

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

Y escribir datos en él (de sourceFile que existe), pero tiene "archivo no existe" excepción para el archivo recién creado.

(Tiene el uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE", and uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE " in 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) {} } 

5 Solutions collect form web for “Por qué alguna vez lanza FileNotFoundException”

Puedo pensar en las siguientes posibles razones de 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 encuentres este problema, prueba a ver si tienes al menos algún espacio disponible a través del administrador de archivos o Configuración -> Almacenamiento. Dudo que puedas hacer algo al respecto si esto es lo que sucede en el dispositivo de tu usuario.
  2. La tarjeta SD no está disponible debido a algún problema del sistema operativo o no está físicamente conectado, por lo que el archivo no se pudo crear. Una vez más – no hay nada que puedas hacer al respecto, aparte de mostrar algún mensaje de Toast con error.
  3. ¿Cómo se genera la parte fileName de la ruta del archivo? A veces los archivos no se pueden crear porque el nombre de archivo contiene caracteres no admitidos (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 tuyo si el nombre de archivo contiene dos puntos. Intente otra manera de generar el nombre de archivo y ver si hace una diferencia.
  4. ¿Se aseguró de que el directorio de Downloads existe antes de crear el archivo dentro de él? Escriba algo como lo siguiente:

     if (!downloadDirectory.exists()) { downloadDirectory.mkdirs(); } 
  5. El permiso WRITE_EXTERNAL_STORAGE se considera peligroso en el Android 6, por lo que puede ser revocado por el usuario en cualquier momento. Asegúrese de que el usuario no revocó este permiso antes de escribir en el archivo.
  6. Cierre siempre el flujo de E / S cuando haya terminado de trabajar con él. Agregue la cláusula finally a su bloque de try-catch y cierre ambos in y out arroyos:

     finally { if (in != null) { try { in.close(); } catch (Exception e) { } } if (out != null) { try { out.close(); } catch (Exception e) { } } } 
  7. El último – y finalmente estoy fuera de opciones. 🙂 Supongo que este problema también podría surgir si se escribe en el mismo archivo de múltiples subprocesos. Si ese es el caso, intente sincronizar el acceso a su código de escritura de archivos.

De acuerdo con los documentos Java – Clase FileNotFoundException :

public class FileNotFoundException extends IOException

Señala que un intento de abrir el archivo denotado por una ruta de acceso especificada ha fallado.

Esta excepción será lanzada por los FileInputStream , FileOutputStream y RandomAccessFile cuando no existe un archivo con la pathname especificada. También será lanzado por estos constructores si el archivo existe, pero por alguna razón es inaccesible, por ejemplo, cuando se hace un intento de abrir un archivo de sólo lectura para escribir.

Para reanudar, hay tres casos donde se puede FileNotFoundException una FileNotFoundException .

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

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

En tu código no veo dos cosas

  1. Quitar el archivo después de escribir con éxito. 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 usted conseguiría otro, pero error más específico – como en mis palabras: incapaz de suprimir el archivo. Bajo uso
  2. Cierre del archivo después de escribir los datos. No veo también un método para cerrar archivos. En tu código, parece que tu archivo sigue abierto, así que vuelves a ejecutar una aplicación y obtienes esto impredecible por tu error.

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

Espero que ayude

  1. El problema puede ocurrir debido a la forma en que crea 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, intente utilizar el siguiente método:

     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 de comunicación no está montado (por ejemplo, en algunos dispositivos antiguos que sucede cuando el usuario conecta el dispositivo a la computadora a través de usb) Así que, trate de comprobar si el medio montado:

     /* 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.

No ha publicado completas rastro de pila de excepción, 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 image-selector-library. & Necesidad de volver a factor de código.

El hombre coomar2841 . Seguramente le ayudará. Ya que pasan horas resolviendo el problema. Así que ahorre su tiempo.

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

Vea el problema de GitHub

Espero que funcione para usted. 🙂

Espero que su código para escribir datos en el archivo es perfecto Estoy concentrado en su problema. Creo que hay dos posibilidades de obtener el archivo no se encuentra Excepción.

  1. Alguna vez el nombre de archivo no es de apoyo Algunos caracteres especiales Mientras que proporcionar este tipo de carácter a dar nombre de archivo en ese momento el archivo no está correctamente generado por eso se produjo este error Por favor asegúrese de que su nombre de archivo es correcto.
  2. Segundo es su extensión de archivo. Aquí no se especifica qué tipo de archivo tiene.

Aquí tengo algunos fragmentos de código Espero que esto le ayudará 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 sólo descargar archivo mp3 de soundcloude y Almacenar en mi local storage.i creo que es exactamente lo mismo que su requirement.so tengo post mi 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 su desarrollador inteligente para que pueda modificar este código de acuerdo a sus necesidades.

La mejor de las suertes

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.