txt array java fileoutputstream

java - array - FileOutputStream se bloquea con el error "error de abrir: EISDIR(es un directorio)" al descargar la imagen



java fileoutputstream txt (4)

Estoy tratando de descargar un iamge desde internet, aquí está el código:

try { String imgURL = c.imgURL; String imgPATH = c.imgPATH; URL url = new URL(imgURL); URLConnection conexion = url.openConnection(); conexion.connect(); int lenghtOfFile = conexion.getContentLength(); try { File f = new File(imgPATH); f.mkdirs(); BufferedInputStream input = new BufferedInputStream(url.openStream()); BufferedOutputStream output = new BufferedOutputStream(new FileOutputStream(imgPATH), 8192); // CRASH HERE byte data[] = new byte[8192]; long total = 0; int count = 0; int updateUILimiter = 0; while ((count = input.read(data)) != -1) { total += count; if (updateUILimiter == 20) // publishProgress((int) (total * 100 / lenghtOfFile)); updateUILimiter = 0; else updateUILimiter++; output.write(data, 0, count); if (isCancelled()) { output.flush(); output.close(); input.close(); return null; } } output.flush(); output.close(); input.close(); } catch (Exception e) { c.imgPATH = ""; return null; } } catch (Exception e) { c.imgPATH = ""; return null; }

Aquí está el mensaje de error:

/mnt/sdcard/tmp/3.png: error al abrir: EISDIR (es un directorio)

¿Por qué es esto?

"/ mnt / sdcard / tmp /" existe.


Primero puede hacer el directorio y luego escribir el código.

URL downloadURL=null; HttpURLConnection urlConnection=null; InputStream inputStream=null; FileOutputStream fos=null; Uri uri=Uri.parse(url); try { downloadURL=new URL(url); urlConnection= (HttpURLConnection) downloadURL.openConnection(); inputStream=urlConnection.getInputStream(); File file=new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getAbsolutePath()+"/myAppImages/"); if(!file.exists()) { file.mkdirs(); } File file1=new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getAbsolutePath()+"/myAppImages/"+uri.getLastPathSegment()); fos=new FileOutputStream(file1); byte[] buffer=new byte[1024]; int read=-1; while((read=inputStream.read(buffer))!=-1) { /* Message.L(""+read);*/ fos.write(buffer,0,read); } }

Así puedes hacer

File file=new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getAbsolutePath()+"/myAppImages/"); if(!file.exists()) { file.mkdirs(); } File file1=new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getAbsolutePath()+"/myAppImages/"+uri.getLastPathSegment()); fos=new FileOutputStream(file1);


El problema es que estás usando la función.

f.mkdirs();

esta función creará una carpeta llamada "3.png" en lugar de un archivo llamado "3.png", así que primero elimine esta carpeta,

entonces reemplaza la función

f.mkdirs();

a

f.createNewFile();

Espero que esto ayude.


Reemplace f.mkdirs() con f.createNewFile().


3.png es un directorio, porque lo haces llamando a f.mkdirs(); . Pruebe f.getParentFile().mkdirs() lugar. De la documentation :

Crea el directorio nombrado por este nombre de ruta abstracto , incluidos los directorios principales necesarios pero inexistentes. Tenga en cuenta que si esta operación falla, es posible que haya logrado crear algunos de los directorios principales necesarios.

(énfasis mío). En otras palabras, la ruta completa contenida en la instancia de File f se toma como un nombre de directorio, hasta e incluyendo la parte final ( 3.png en la salida de ejemplo).