2012-02-26 89 views
0

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

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 

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

+0

检查内部异常。 – 2012-02-26 00:26:58

+0

@TomasVoracek如何做到这一点? – 2012-02-26 00:27:51

+0

使用IOException.printStackTrace,或者只是在调试模式下检查可用的方法/属性。 http://stackoverflow.com/questions/8217500/how-to-print-stacktrace-for-an-exception-android – 2012-02-26 00:30:51

回答

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]; 
........ 
........ 
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)并相应地修改您的最终用户诊断和恢复。

+0

我会记住这一点,谢谢。 – 2012-02-26 05:34:19

相关问题