下载图像时,FileOutputStream因“打开失败:EISDIR(是一个目录)”错误而崩溃

我正在尝试从互联网上下载iamge,这是代码:

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; } 

这是错误消息:

/mnt/sdcard/tmp/3.png:打开失败:EISDIR(是一个目录)

为什么是这样?

“/ mnt / sdcard / tmp /”存在。

3.png是一个目录,因为你通过调用f.mkdirs();实现它f.mkdirs(); 。 请尝试使用f.getParentFile().mkdirs() 。 从文档 :

创建此抽象路径名指定的目录,包括任何必需但不存在的父目录。 请注意,如果此操作失败,则可能已成功创建一些必需的父目录。

(强调我的)。 换句话说, File实例f包含的整个路径被视为目录名,直到并包括最后一部分(示例输出中为3.png )。

问题是您正在使用该function

 f.mkdirs(); 

此函数将创建一个名为“3.png”的文件夹,而不是名为“3.png”的文件,因此请先删除此文件夹,

在此处输入图像描述

然后更换function

 f.mkdirs(); 

 f.createNewFile(); 

希望这有帮助。

f.mkdirs()替换f.createNewFile().

您可以先创建目录,然后再编写代码。

  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); } } 

你可以这样做

 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);