0

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

ファイルの書き込み権限を取得するために、別のファイル オブジェクトに出力ディレクトリを作成する必要がある理由を説明できる人はいますか?

4

1 に答える 1

2

これはパーミッションの失敗ではなく、の誤用ですFileWriter

最初のコード スニペットでは、次の理由state.jsonにより、 の呼び出しによって という名前のディレクトリが作成されています。mkdirs()

必要だが存在しない親ディレクトリを含め、この抽象パス名で指定されたディレクトリを作成します。この操作が失敗した場合、必要な親ディレクトリの作成に成功している可能性があることに注意してください。

次に、a を使用してディレクトリへの書き込みを試みFileWriterますが、失敗します。以下はthrowsFrom 句FileWriter(File)です。

IOException-ファイルは存在するが、通常のファイルではなくディレクトリである場合、存在しないが作成できない場合、またはその他の理由で開くことができない場合

2 番目のスニペットは、state( の親を使用しているため\\state\\state.json) という名前のディレクトリを作成し、次に という名前のファイルを作成するため、通常のファイルをstate.json使用して成功します。FileWriter

于 2013-07-15T14:26:37.387 に答える