2013-07-15 132 views
0

在我正在使用JDK 7u25的Windows 7中开发的一个项目中,我有一个存储应用程序状态的类。该类有一个静态的save方法将状态保存到磁盘。我原本有以下代码。 (stateJSONObject,我假设输出目录已不一定是当这个函数被调用创建。)可写文件权限问题

public State { 
    private static String stateFile = "\\state\\state.json"; 

    public static void save() { 
     try { 
      File sFile = new File(stateFile); 
      sFile.mkdirs(); 
      sFile.setWritable(true); 
      FileWriter file = new FileWriter(sFile); 
      String str = state.toString(4); 
      file.write(str); 
      file.close(); 
     } catch (IOException ex) { 
      HLogger.log(ex.getMessage()); 
     } 
    } 
} 

每当我跑这个代码,它记录一个IOException - 抱怨访问状态文件被拒绝。我发现,如果我更改了save函数(如下所示),它将完全按预期工作。

public static void save() { 
     try { 
      File sFile = new File(stateFile); 
      File path = new File(sFile.getParent()); 
      path.mkdirs(); 
      sFile.setWritable(true); 
      FileWriter file = new FileWriter(sFile); 
      String str = state.toString(4); 
      file.write(str); 
      file.close(); 
     } catch (IOException ex) { 
      HLogger.log(ex.getMessage()); 
     } 
    } 

谁能解释为什么它是必要的,以便获得写权限的文件创建一个单独的文件对象的输出目录?

回答

2

这不是权限失败,而是FileWriter的误用。

在第一个代码段正被调用创建mkdirs()名为state.json目录,因为它:

创建此抽象路径名指定的目录,包括所有必需但不存在的父目录。请注意,如果此操作失败,它可能已成功创建一些必需的父目录。

然后尝试使用FileWriter写入目录,这会失败。以下是throws条款从FileWriter(File)

IOException - 如果该文件存在,但它是一个目录,而不是一个常规文件,不存在,但不能被创建,或者无法打开任何其他原因

第二代码段创建一个名为state(因为它使用的\\state\\state.json父目录),然后一个名为state.json文件,因此在其上成功常规文件使用FileWriter

+0

啊。这很有道理。谢谢! – JCVanHamme