でもJava.util.properties
はプロパティファイルの読み取りと書き込みを許可しますが、書き込みはフォーマットを保持しません。プロパティファイルに関連付けられていないため、当然のことです。
コメントと空白行を保持し、プロパティ値を適切に更新するPropertyFile
クラス(またはそのようなクラス)はありますか?
ApacheのCommons Configuration APIよりもはるかに優れているわけではありません。これにより、プロパティファイル、XML、JNDI、JDBCデータソースなどから構成するための統一されたアプローチが提供されます。
プロパティファイルの処理はとても良いです。これにより、プロパティから PropertiesConfigurationLayout オブジェクトを生成でき、プロパティファイルに関するできるだけ多くの情報(空白、コメントなど)が保持されます。プロパティファイルへの変更を保存すると、これらは可能な限り保存されます。
サンプルコード:
import Java.io.File;
import Java.io.FileInputStream;
import Java.io.FileNotFoundException;
import Java.io.InputStreamReader;
import org.Apache.commons.configuration.ConfigurationException;
import org.Apache.commons.configuration.PropertiesConfiguration;
import org.Apache.commons.configuration.PropertiesConfigurationLayout;
public class PropertiesReader {
public static void main(String args[]) throws ConfigurationException, FileNotFoundException {
File file = new File(args[0] + ".properties");
PropertiesConfiguration config = new PropertiesConfiguration();
PropertiesConfigurationLayout layout = new PropertiesConfigurationLayout(config);
layout.load(new InputStreamReader(new FileInputStream(file)));
config.setProperty("test", "testValue");
layout.save(new FileWriter("path\\to\\properties\\file.properties", false));
}
}
参照:
PatrickBoosによって提供されたApacheCommonsConfigurationライブラリを使用するためのサンプルコードは不必要に複雑です。出力を高度に制御する必要がない限り、PropertiesConfigurationLayoutを明示的に使用する必要はありません。コメントとフォーマットを保持するには、PropertiesConfiguration自体で十分です。
PropertiesConfiguration config = new PropertiesConfiguration("myprops.properties");
config.setProperty("Foo", "Bar");
config.save();
(注:このコードは、既存の1.10安定バージョンで機能します。現在利用可能な2.0アルファビルドで機能するかどうかは確認していません。)
PropertiesConfiguration クラスを含む Apache Commons Configuration を見ることができます。しかし、私はそれを使ったことがないので、コメントとフォーマットが保持されているかどうかはわかりません...
しかし、それは試してみる価値があります...
Configuration2クラスの構文は異なります。それらを使用した例を次に示します。
import org.Apache.commons.configuration2.PropertiesConfiguration;
import org.Apache.commons.configuration2.PropertiesConfigurationLayout;
public void test() {
PropertiesConfiguration config = new PropertiesConfiguration();
PropertiesConfigurationLayout layout = new PropertiesConfigurationLayout();
config.setLayout(layout);
layout.load(config, new FileReader("config.properties"));
config.setProperty("KEY", "VALUE");
StringWriter stringWriter = new StringWriter();
layout.save(config, stringWriter);
LOG.debug("Properties:\n{}", stringWriter.toString());
}
File file = new File("src/test/resources/1automation.properties");
PropertiesConfiguration config = new PropertiesConfiguration();
PropertiesConfigurationLayout layout = new PropertiesConfigurationLayout(config);
layout.load(new InputStreamReader(new FileInputStream(file)));
FileWriter fw = new FileWriter("src/test/resources/1automation.properties",false);
config.setProperty("myssi.admin.name", "testValue");
layout.save(fw);
最良の答えには小さな間違いが含まれています。
PropertiesConfigurationLayout layout = new PropertiesConfigurationLayout(config);
次のように置き換える必要があります。
PropertiesConfigurationLayout layout = config.getLayout();