编写文件时出现神秘的IOException

时间:2012-02-26 00:24:48

标签: java android

这是我用来将文件.name写入路径/sdcard/中名称以cimage开头的某些文件夹的代码。目前我有4个这样的文件夹,其中2个是最近创建的。问题在于这两个并影响我稍后手动添加的任何文件夹。

public static void WriteName(ArrayList<String> citem) {
    final String not_writable = "norw";
    for (int i = 0; i < citem.size(); i++) {
        try {
            File root = new File(Environment.getExternalStorageDirectory()
                    .getName() + "/" + citem.get(i));
            File namefile = new File(root, ".name");
            FileReader namereader = new FileReader(namefile);
            BufferedReader in = new BufferedReader(namereader);
            String[] str_array = new String[4];
            str_array[0] = in.readLine();
            str_array[1] = in.readLine();
            str_array[2] = in.readLine();
            str_array[3] = in.readLine();
            Log.d("NameWrite", "line 4: " + str_array[3]);
            if (str_array[3] == null || !str_array[3].equals(not_writable)) {
                FileWriter namewriter = new FileWriter(namefile);
                BufferedWriter out = new BufferedWriter(namewriter);
                out.write(i
                        + "\nCImage_"
                        + (i)
                        + "\nAutogenerated Stub\nnorw\n");
                out.close();
            } else {
                Log.d("NameManager.WriteName", "Skipping " + root
                        + ", norw set");
            }
        } catch (IOException e) {
            Log.e("NameManager.java : ", ("Error!! Not Writable!!"
                    + Environment.getExternalStorageDirectory().getName()
                    + "/" + citem.get(i)));
        }
    }

}

所以会发生的情况是,当该方法尝试写入最后2个文件夹时,它会抛出IOException

02-26 05:42:39.663: D/NameManager.java(5316): Checking for whatever
02-26 05:42:39.671: D/NameManager.java(5316): SDcard mounted RW
02-26 05:42:40.694: D/java.lang.java.lang.String(5316): file (43) :cimages
02-26 05:42:40.694: D/java.lang.java.lang.String(5316): file (76) :cimages_1
02-26 05:42:40.694: D/java.lang.java.lang.String(5316): file (77) :cimageslkj
02-26 05:42:40.694: D/java.lang.java.lang.String(5316): file (81) :cimages_2
02-26 05:42:40.694: D/NameWrite(5316): line 4: norw
02-26 05:42:40.694: D/NameManager.WriteName(5316): Skipping sdcard/cimages, norw set
02-26 05:42:40.702: D/NameWrite(5316): line 4: norw
02-26 05:42:40.702: D/NameManager.WriteName(5316): Skipping sdcard/cimages_1, norw set
02-26 05:42:40.702: E/NameManager.java :(5316): Error!! Not Writable!!sdcard/cimageslkj
02-26 05:42:40.710: E/NameManager.java :(5316): Error!! Not Writable!!sdcard/cimages_2
02-26 05:42:40.725: D/java.lang.java.lang.String(5316): file (77) :cimageslkj

我找不到这种行为的解释。所有其他应用程序都可以写入这些文件夹,以防您想知道。可能导致这种情况的原因是什么?

3 个答案:

答案 0 :(得分:1)

使用LogCat将错误记录到控制台,请参阅How to print stacktrace for an exception Android

同时检查堆栈跟踪,它提供了有关错误的最有用的信息。

答案 1 :(得分:0)

这并不神秘,我只是忘了为.name不存在的情况添加一个循环。添加此循环可以修复它。

........
........
try {
                File root = new File(Environment.getExternalStorageDirectory()
                        .getName() + "/" + fsitem.get(i));
                File namefile = new File(root, ".name");
                if (!namefile.exists()){
                    namefile.createNewFile();
                }
                FileReader namereader = new FileReader(namefile);
                BufferedReader in = new BufferedReader(namereader);
                String[] str_array = new String[4];
........
........

答案 2 :(得分:0)

问题的很大一部分在于:

        } catch (IOException e) {
            Log.e("NameManager.java : ", ("Error!! Not Writable!!"
                + Environment.getExternalStorageDirectory().getName()
                + "/" + citem.get(i)));
        }

您丢弃了IOException中已捕获的所有信息,包括实际例外的名称及其消息。抛弃基本的异常信息是不好的做法......而且你已经被烧掉了。

最佳做法是使用Log.e(tag, msg, throwable)重载在日志中包含异常。

或者,如果这是“用户错误”,您需要诊断问题并将其报告给用户。为此,您可能需要捕获IOException的相关子类型(例如FileNotFoundException)并相应地定制最终用户诊断和恢复。