web-dev-qa-db-ja.com

プロパティファイルを更新するためのより良いクラス?

でもJava.util.propertiesはプロパティファイルの読み取りと書き込みを許可しますが、書き込みはフォーマットを保持しません。プロパティファイルに関連付けられていないため、当然のことです。

コメントと空白行を保持し、プロパティ値を適切に更新するPropertyFileクラス(またはそのようなクラス)はありますか?

38

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

参照:

57
Il-Bhima

PatrickBoosによって提供されたApacheCommonsConfigurationライブラリを使用するためのサンプルコードは不必要に複雑です。出力を高度に制御する必要がない限り、PropertiesConfigurationLayoutを明示的に使用する必要はありません。コメントとフォーマットを保持するには、PropertiesConfiguration自体で十分です。

PropertiesConfiguration config = new PropertiesConfiguration("myprops.properties");
config.setProperty("Foo", "Bar");
config.save();

(注:このコードは、既存の1.10安定バージョンで機能します。現在利用可能な2.0アルファビルドで機能するかどうかは確認していません。)

8
John Rix

PropertiesConfiguration クラスを含む Apache Commons Configuration を見ることができます。しかし、私はそれを使ったことがないので、コメントとフォーマットが保持されているかどうかはわかりません...

しかし、それは試してみる価値があります...

7
Romain Linsolas

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());
}
3
Kevin Le
    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);
1
Tarun Gupta

最良の答えには小さな間違いが含まれています。

PropertiesConfigurationLayout layout = new PropertiesConfigurationLayout(config);

次のように置き換える必要があります。

PropertiesConfigurationLayout layout = config.getLayout();
0
Jeremy