0

在我正在使用 JDK 7u25 在 Windows 7 中进行的项目中,我有一个存储应用程序状态的类。该类具有save将状态保存到磁盘的静态方法。我最初有以下代码。(state是 aJSONObject并且我假设在调用此函数时不一定创建输出目录。)

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());
        }
    }

谁能解释为什么需要在单独的文件对象中创建输出目录才能获得文件的写权限?

4

1 回答 1

2

这不是权限失败,而是滥用FileWriter.

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

创建由此抽象路径名命名的目录,包括任何必要但不存在的父目录。请注意,如果此操作失败,它可能已成功创建一些必要的父目录。

然后尝试使用 a 写入目录FileWriter,但失败了。以下是throwsFrom 子句FileWriter(File)

IOException-如果文件存在但是是目录而不是常规文件,不存在但无法创建,或者由于任何其他原因无法打开

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

于 2013-07-15T14:26:37.387 回答