1

java.util.Properties私は最近、独自の関数を作成せずに設定を読み書きできることを知りました。

とても使いやすいのでワクワクしましたが、後で変更した構成ファイルを保存したときに欠陥に気付きました。

これが私のコードです。今のところ非常に単純です。

FileWriter writer = null;
Properties configFile = new Properties();
configFile.load(ReadFileTest.class.getClassLoader().getResourceAsStream("config.txt"));

String screenwidth = configFile.getProperty("screenwidth");
String screenheight = configFile.getProperty("screenheight");
System.out.println(screenwidth);
System.out.println(screenheight);
configFile.setProperty("screenwidth", "1024");
configFile.setProperty("screenheight", "600");
try {
    writer = new FileWriter("config.txt" );
    configFile.store(writer, null);
} catch (IOException e) {
    e.printStackTrace();
}
writer.flush();
writer.close();

私が気付いた問題は、編集しようとしている構成ファイルが次のように保存されていることです。

foo: bar
bar: foo
foobar: barfoo

ただし、後の出力properties.store(writer, null)は次のとおりです。

foo=bar
bar=foo
foobar=barfoo

私が編集する構成ファイルは私のプログラム用ではありません。構成ファイルを上記の区切り記号付きの形式にする必要がある他のアプリケーション用:です。そうしないと、構成がデフォルトにリセットされます。

これを簡単に変更する方法を知っている人はいますか?

最初の 5 つの Google ページを検索しましたが、同様の問題を抱えている人は見つかりませんでした。Javadoc も確認しましたが、自分でクラスを作成せずに Javadoc を変更できる関数は見つかりませんでした。Properties置いてあってとても使いやすいので、とりあえず使ってみたいと思います。また、ファイルを保存した後にすべて=を置き換えるという考えもありましたが、誰かがより良い提案を得たのでしょうか?:

4

2 に答える 2

2

タスク用に設計されていないツールを使用しないでください -Propertiesここでは使用しないでください。代わりに、私はあなた自身のものを書くだけです - それは十分に簡単なはずです。

インスタンスを「ストア」として引き続き使用できますがProperties、プロパティをテキストにシリアル化するために使用しないでください。代わりに、 a を使用しFileWriter、プロパティを反復処理して、行を自分で記述します - as key + ": " + value.

于 2012-01-08T15:31:48.213 に答える
0

ここで新しいアイデア

= を : に変換することについてのあなたのコメントは、私に考えさせました: Properties.store() は Stream に書き込みます。メモリ内の ByteArrayOutputStream を使用し、ファイルに書き込む前にメモリ内で適切に変換してから、ファイルを書き込むことができます。Properties.load() についても同様です。または、代わりに FilterXXX を挿入することもできます。(私はおそらく記憶の中でそれをするでしょう)。


サブクラス化がどれほど難しいかを調べていました。それはほとんど不可能です。:-(

Properties のソース コードを見ると (私は Java 6 を見ています)、store() は store0() を呼び出します。残念ながら、store0 は非公開であり、保護されておらず、"=" はプロパティから読み取られるものではなく、魔法の定数として指定されています。そして、多くの魔法の定数を持つ saveConvert() という別のプライベート メソッドを呼び出します。

全体として、私はこのコードを D- 品質と評価します。これは、優れたコードと優れたスタイルのほとんどすべてのルールを破っています。

しかし、これはオープン ソースであるため、理論的には、一連のコードを独自の BetterProperties クラスにコピー アンド ペースト (および改善) することができます。

于 2012-01-28T02:23:17.417 に答える