【问题标题】:IOException when trying to access SD card from android尝试从android访问SD卡时出现IOException
【发布时间】:2011-07-25 18:47:35
【问题描述】:

每个人。我正在尝试将带有 android 的图片保存到 sd 卡上的公共图片目录中。但是,我似乎无法打开文件进行写入。这是代码:

                boolean mExternalStorageWriteable = false;
            String state = Environment.getExternalStorageState();

            if (Environment.MEDIA_MOUNTED.equals(state)) {

               mExternalStorageWriteable = true;
            } 

            if(mExternalStorageWriteable){
                    File root_dir = Environment.getExternalStorageDirectory();
                    root_dir.mkdirs();
                    File pictures_directory = new File(root_dir, "/Pictures/");
                    pictures_directory.mkdirs();
                    File outputfile = new File(pictures_directory, "test_file.jpg");
                    try {
                        outputfile.createNewFile();
                        FileOutputStream out = new FileOutputStream(outputfile);
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
            }



我的调试器总是跳转到 catch 块(由 createNewFile 调用引起),并且 IOExceptions 消息是“不是目录”。如果我删除 createNewFile 调用,FileOutPutStream 构造函数将引发 FileNotFound 异常。但是,将文件输出流打开到文件系统的根目录或图片目录似乎可以正常工作。

为了避免显而易见,我的清单包含 标签。我正在使用 API 级别 5,并且我的模拟器上安装了一个虚拟 SD 卡。非常感谢任何建议。

已解决:模拟器文件系统存在问题。 DDMS 显示 /Pictures/ 出于某种原因被创建为文件或目录。创建一个新的模拟器解决了这个问题。

【问题讨论】:

    标签: android filenotfoundexception android-sdcard


    【解决方案1】:

    您混淆了以下两种方法:

    File(String Path)File(File dir, String name)

    因此,pictures_directory 应该是一个目录,而不是一个完整的路径 + 文件名。

    尝试改变

    File pictures_directory = new File(root_dir, "/Pictures/");
    

    File pictures_directory = new File(root_dir + "/Pictures/");
    

    【讨论】:

    • 试过了,但没有骰子。我不确定 java File 库在目录和单个文件之间有很大区别吗?
    【解决方案2】:

    这通常是硬编码器路径分隔符的一种不好的方式。试试Pictures 而不是/Pictures/。最后一个是绝对路径,指向根目录下的文件夹:

    File pictures_directory = new File(root_dir, "Pictures");
    

    更新:

    我已经编译并运行了您的代码 sn-p 没有任何问题。所以问题出在你的模拟器文件系统中。尝试先删除该图片文件,甚至为您的模拟器创建一个新的 sdcard 图像。

    【讨论】:

    • 我尝试了您的建议,但没有奏效。无论如何,我并不认为这是问题所在,因为如前所述,我可以成功地将 FileOutputStream 打开到 Pictures 目录。另一条可能有用的信息是我的调试器将图片目录路径显示为“/mnt/sdcard/Pictures”
    • @Colin 这很奇怪。我已经编译并运行了您的代码 sn-p 没有任何问题。所以我想问题出在你的模拟器文件系统中。尝试先删除该图片文件,甚至为您的模拟器创建一个新的 sdcard 图像。
    • 您的假设似乎是正确的。我已经用一个新的模拟器对其进行了测试,一切运行良好。非常感谢。
    • @Colin 用解决方案更新了答案,因此其他人更容易找到它。
    【解决方案3】:

    试试这个方法。确保你的 res/drawable 目录中有 test_file.jpg。

        private void writeToSDCard() {
        try {
            File root = Environment.getExternalStorageDirectory();
    
            if (root.canWrite()){
                InputStream from = getBaseContext().getResources().openRawResource(R.drawable.test_file);
                File dir = new java.io.File (root, "Pictures");
                dir.mkdir();
                File writeTo = new File(root, "Pictures/test_file.jpg");
                FileOutputStream  to = new FileOutputStream(writeTo);
    
                byte[] buffer = new byte[4096];
                int bytesRead;
    
                while ((bytesRead = from.read(buffer)) != -1)
                    to.write(buffer, 0, bytesRead); // write
                to.close();             
                from.close();
            } else {
                Log.d("MyActivity", "Unable to access SD card.");
            }
        } catch (Exception e) {
            Log.d("MyActivity", "writeToSDCard: " + e.getMessage());
        }
    }   "
    

    【讨论】:

    • 我试过了,但是当它试图创建它时,我仍然遇到异常,它命中了 FileOutputStream(writeTo)。以下是 FileNotFoundException 的确切详细信息:“/mnt/sdcard/Pictures/test_file.jpg (Not a directory)”。
    • 我假设您使用的是 Eclipse。您能否转到 DDMS 透视图(屏幕)并查看文件资源管理器并查看是否正在创建图片目录。这是在模拟器上还是在实际设备上?如果它在模拟器上,您在创建 AVD 时是否创建了 sd 卡(在 Android SDK 和 AVD 管理器中)。
    • 你的假设是正确的。 /mnt/sdcard目录下有一个Pictures文件,但它看起来不像文件夹,它只是显示为一个文件。其他统计:大小为0,权限为----rwxr-x。另一个可能有用的事实是它甚至在它进入函数之前就已经存在。我假设系统会创建它。 PS:我正在虚拟设备(Android 2.2)上进行测试,它确实安装了 SD 卡。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-09
    • 1970-01-01
    • 2021-12-11
    • 2011-07-06
    • 1970-01-01
    • 2015-07-27
    相关资源
    最近更新 更多