0

私が取り組んでいるこのプロジェクトの構成ファイル (プロパティ) が必要です。問題は、Properties インスタンスがファイルからの読み込みに失敗することです (例外や目に見える問題はありません) が、適切に保存できます。

私はデフォルトの HashMap を持っているので、存在しないプロパティのデフォルト値は Properties インスタンスに配置され、すべてが保存されるため、運用サーバーが更新されたときに新しいプロパティがシームレスに追加されます。

このバグを何時間も追跡してきましたが、修正できません。ここ StackOverflow に関する多数の質問と、他のサイトのコード例を読みました。何も助けませんでした。

まだ削除せず、代わりに DB を使用した理由の 1 つは、JDBC ドライバーの URL、ユーザー、およびパスワードもそのファイルに格納されていることです。ファイルがハード ドライブに対して読み書きされていることに注意してください。

デフォルトのシステムではファイルが配置されるため、読み込もうとしたときにファイルが存在しなくても、保存後に表示されますが、次の実行では何も読み込まれません。設定を変更した後にバグに気付き、数回実行した後にファイルを確認したところ、驚いたことに、すべての値がデフォルトでした。

現在起こっていることは次のとおりです。1) ファイルがそこにあるかどうかに関係なく、プロパティは何もロードしません。2) Properties インスタンスには何もないため、デフォルトで埋められます。3) インスタンスが保存され、デフォルト値でファイルが上書きされます。

関連するすべてのコードは次のとおりです。

private static Properties getConfig(){
    Properties properties = new Properties();
    File cfgFile = new File("data/titallus.properties");
    try{
        if(cfgFile.createNewFile()){
            System.out.println("Config file not found. A default config file will be created automatically.");
        }
        FileReader reader = new FileReader(cfgFile);
        FileWriter writer = new FileWriter(cfgFile);
        properties.load(reader);
        reader.close();
        System.out.println(properties); // Debug, always prints '{}'
        for(String k : defaults.keySet()){
            if(!properties.containsKey(k)){
                properties.setProperty(k, defaults.get(k));
            }
        }
        properties.store(writer, "Titallus Configuration File");
        writer.close();
    }catch(Exception e){
        e.printStackTrace();
        System.exit(-1);
    }
    return properties;
}

考えられる限りのことを試しましたが、無駄でした。また、多言語サポート用の Properties サブクラスもあり、これは問題なく動作します。

これを修正する方法、または少なくともこれに対する別のアプローチを知っている人はいますか?

4

2 に答える 2

2
FileWriter writer = new FileWriter(cfgFile);

ファイルから読み取る前にファイルを消去します。

于 2013-07-02T04:12:41.190 に答える
0

ファイルをロードするFileWriterにファイルの を作成すると、既存のデータが消去されます。

于 2013-07-02T04:12:09.097 に答える