【问题标题】:File mkdirs() method not working in android/java文件 mkdirs() 方法在 android/java 中不起作用
【发布时间】:2010-12-28 03:58:44
【问题描述】:

我已经为此烦恼了一段时间了。以下方法应该是下载一个文件,并将其保存到硬盘上指定的位置。

private static void saveImage(Context context, boolean backgroundUpdate, URL url, File file) {

    if (!Tools.checkNetworkState(context, backgroundUpdate))
        return;

    // Get the image
    try {
        // Make the file
        file.getParentFile().mkdirs();

        // Set up the connection
        URLConnection uCon = url.openConnection();
        InputStream is = uCon.getInputStream();
        BufferedInputStream bis = new BufferedInputStream(is);

        // Download the data
        ByteArrayBuffer baf = new ByteArrayBuffer(50);
        int current = 0;
        while ((current = bis.read()) != -1) {
                baf.append((byte) current);
        }

        // Write the bits to the file
        OutputStream os = new FileOutputStream(file);
        os.write(baf.toByteArray());
        os.close();
    } catch (Exception e) {
        // Any exception is probably a newtork faiilure, bail
        return;
    }
}

另外,如果文件不存在,它应该为该文件创建目录。 (如果那个地方已经有另一个文件,它不应该做任何事情)。但是,由于某种原因,mkdirs() 方法永远不会创建目录。我已经尝试了从显式括号到显式创建父文件类的所有方法,但似乎没有任何效果。我相当确定驱动器是可写的,因为它只是在已经确定之后才被调用,在调试时运行它也是如此。因此该方法失败,因为没有创建父目录。谁能告诉我我的称呼有什么问题吗?

另外,如果有帮助,这里是我调用它的文件的来源:

https://github.com/LeifAndersen/NetCatch/blob/master/src/net/leifandersen/mobile/android/netcatch/services/RSSService.java

谢谢

【问题讨论】:

    标签: java android file


    【解决方案1】:

    如果您正在向 SD 卡写入内容,希望您已在清单中添加 android.permission.WRITE_EXTERNAL_STORAGE 权限

    【讨论】:

    • 我不敢相信,它奏效了。我现在觉得自己像个白痴。但另一方面,它正在神奇地运行该项目的其他版本,很奇怪。非常感谢。
    【解决方案2】:

    请检查一下,它可能对你有帮助..

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
    

    在您的清单文件中输入 tis 权限。

    【讨论】:

      【解决方案3】:

      Kevin Day 的回复之外,还有另一种失败方式,以前的帖子没有提到。即使您的清单中有android.permission.WRITE_EXTERNAL_STORAGE,如果您尝试写入作为USB 设备外部安装的/mnt/sdcard 之类的媒体(即,您将设备作为外部磁盘连接到您的PC 上) USB 电缆)在您尝试写入时,您无法写入 /mnt/sdcard 文件系统。在这种情况下,FILE.mkdir 将返回 false。显然,如果您不检查返回码,那么在您尝试在您认为自己创建的目录中创建文件之前,您在收到IOException 之前不会看到此问题。如果你不在这个不存在的目录中创建文件,那么应用程序将默默地失败。

      我在调试 Android 应用程序时经常犯这个错误 - 忘记了我不能在外部安装 sdcard 的同时让我的应用程序写入它。

      【讨论】:

        【解决方案4】:

        你确定 mkdirs 失败了吗?为什么不检查 mkdirs 调用的返回值,如果返回 false 则记录错误消息?

        if (!file.getParentFile().exists() && !file.getParentFile().mkdirs()){
          log("Unable to create " + file.getParentFile());
        }
        

        我怀疑您可能会对文件的内容感到惊讶...

        PS - 请使用该错误处理程序做一些事情 - 至少记录错误。捕获异常并进行静默返回是可怕的做法。

        【讨论】:

        • 很好地记录错误,这是个好主意,我现在已经改变了。它声称它无法创建文件(按照建议将您的错误插入其中)。
        猜你喜欢
        • 1970-01-01
        • 2017-09-22
        • 2018-03-16
        • 2015-11-07
        • 2013-05-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-04
        • 1970-01-01
        相关资源
        最近更新 更多