下载图像时,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/” 存在。

原文由 Omar 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 502
2 个回答

3.png 是一个目录,因为您通过调用 f.mkdirs(); 来创建目录。尝试 f.getParentFile().mkdirs() 代替。从 文档 中:

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

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

原文由 Dirk 发布,翻译遵循 CC BY-SA 3.0 许可协议

问题是您正在使用该功能

f.mkdirs();

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

在此处输入图像描述

然后替换函数

f.mkdirs();

f.createNewFile();

希望这有帮助。

原文由 Led Machine 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题