在我正在使用JDK 7u25工作的Windows 7项目中,我有一个存储应用程序状态的类。该类有一个静态save
方法将状态保存到磁盘。我原来有以下代码。 (state
是JSONObject
,我假设在调用此函数时不一定创建输出目录。)
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());
}
}
有人可以解释为什么有必要在单独的文件对象中创建输出目录以获取文件的写入权限吗?
答案 0 :(得分:2)
这不是权限失败,而是对FileWriter
的误用。
在第一个代码段中,通过调用mkdirs()
创建了一个名为state.json
的目录,因为它:
创建此抽象路径名所指定的目录,包括任何必要但不存在的父目录。请注意,如果此操作失败,则可能已成功创建了一些必要的父目录。
然后尝试使用FileWriter
写入目录,但失败了。以下是来自FileWriter(File)
的throws
子句:
IOException
- 如果文件存在但是是目录而不是常规文件,则不存在但无法创建,或因任何其他原因无法打开
第二个代码段创建一个名为state
的目录(因为它使用的是\\state\\state.json
的父级),然后是一个名为state.json
的文件,因此使用了FileWriter
成功的常规文件。