2013-07-15 30 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