下载图像时,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);