文件mkdirs()方法在android / java中不起作用

时间:2010-12-28 03:58:45

标签: java android file

我已经把头发拉了一段时间了。以下方法应该下载文件,并将其保存到硬盘驱动器上指定的位置。

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

谢谢

4 个答案:

答案 0 :(得分:30)

如果您要将内容写入SD卡,则希望您在清单中添加了android.permission.WRITE_EXTERNAL_STORAGE权限

答案 1 :(得分:13)

请检查一下,它可以帮助你..

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

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

答案 2 :(得分:5)

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

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

答案 3 :(得分:3)

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

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

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

PS - 请使用该错误处理程序执行某些操作 - 至少记录错误。捕捉异常并做出无声的回归是一种可怕的做法。