1

これまでのところ、PropertiesConfiguration (Apache から) を使用してプロパティ ファイルを読み込み、編集したい値を編集して、変更をファイルに保存するこのプロジェクトがあります。コメントやフォーマットなどは保持されますが、変更されることの 1 つは、次のようにフォーマットされた複数行の値を取得することです。

key=value1,\
    value2,\
    value3

そしてそれを配列スタイルに変えます:

key=value1,value2,value3

以前のようにフォーマットされた行を印刷できるようにしたいと思います。
私はこの方法でこれを行いました:

PropertiesConfiguration config = new PropertiesConfiguration(configFile);
config.setProperty(key,value);
config.save();
4

2 に答える 2

0

他の誰かがこの機能を必要とする場合に備えて、回避策を作成しました。また、おそらくこれを行うためのより良い方法がありますが、この解決策は現在私にとってうまくいきます。

まず、PropertiesConfiguration 区切り文字を次のように改行文字に設定します。

PropertiesConfiguration config = new PropertiesConfiguration(configFile);
config.setListDelimiter('\n');

次に、すべてのプロパティを反復して更新する必要があります (形式を設定するため)。

Iterator<String> keys = config.getKeys();
    while (keys.hasNext()) {
        String key = keys.next();

        config.setProperty(key,setPropertyFormatter(key, config.getProperty(key))) ;

    }

このメソッドを使用して、値リスト データをフォーマットします (上記を参照)。

private List<String> setPropertyFormatter(String key, Object list) {
    List<String> tempProperties = new ArrayList<>();
    Iterator<?> propertyIterator = PropertyConverter.toIterator(list, '\n');;
    String indent = new String(new char[key.length() + 1]).replace('\0', ' ');

    Boolean firstIteration = true;
    while (propertyIterator.hasNext()) {
        String value = propertyIterator.next().toString();

        Boolean lastIteration = !propertyIterator.hasNext();

        if(firstIteration && lastIteration) {
            tempProperties.add(value);
            continue;
        }

        if(firstIteration) {
            tempProperties.add(value + ",\\");
            firstIteration = false;
            continue;
        }

        if (lastIteration) { 
            tempProperties.add(indent + value);
            continue;
        } 

        tempProperties.add(indent + value + ",\\");
    }



    return tempProperties;
}

保存関数がリストに保存されている二重のバックスラッシュを取り、ファイル内でそれを 4 つのバックスラッシュに変換することを除いて、それはほとんど正しいでしょう! したがって、それらを単一のバックスラッシュに置き換える必要があります。私はこれを次のようにしました:

try {
        config.save(new File(filePath));


        byte[] readIn = Files.readAllBytes(Paths.get(filePath));
        String replacer = new String(readIn, StandardCharsets.UTF_8).replace("\\\\\\\\", "\\");

        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(filePath, false), "UTF-8"));
        bw.write(replacer);
        bw.close();

} catch (ConfigurationException | IOException e) {
        e.printStackTrace();
}
于 2015-07-14T18:44:34.110 に答える
0

commons-configuration2 では、「カスタム プロパティ リーダーとライター」の下のドキュメントで説明されているように、カスタム PropertiesWriter 実装でこのようなケースを処理します (ただし、リーダー バイアス)。

ライターは、プロパティ ファイルに書き込まれる各文字の書き込みを管理する方法を提供するため、( を介して) ライターを使用して、ほぼすべてのことを実現できますPropertiesWriter.write(String)。適当に改行( )を書く便利な方法もありますPropertiesWriter.writeln(String)

たとえば、Netbeans Ant プロジェクトの project.properties ファイルのクラスパス エントリを処理する必要がありました。

public class ClasspathPropertiesWriter extends PropertiesConfiguration.PropertiesWriter {
    
    public ClasspathPropertiesWriter(Writer writer, ListDelimiterHandler delimiter) {
        super(writer, delimiter);
    }

    @Override
    public void writeProperty(String key, Object value, boolean forceSingleLine) throws IOException {
        switch (key) {
            case "javac.classpath":
            case "run.classpath":
            case "javac.test.classpath":
            case "run.test.classpath":
                String str = (String) value;
                String[] split = str.split(":");
                if (split.length > 1) {
                    write(key);
                    write("=\\");
                    writeln(null);
                    for (int i = 0; i < split.length; i++) {
                        write("    ");
                        write(split[i]);
                        if (i != split.length - 1) {
                            write(":\\");
                        }
                        writeln(null);
                    }
                    
                } else {
                    super.writeProperty(key, value, forceSingleLine);
                }                
                break;

            default:
                super.writeProperty(key, value, forceSingleLine);
                break;
        }
        
    }
    
}
public class CustomIOFactory extends PropertiesConfiguration.DefaultIOFactory {

    @Override
    public PropertiesConfiguration.PropertiesWriter createPropertiesWriter(
            Writer out, ListDelimiterHandler handler) {
        return new ClasspathPropertiesWriter(out, handler);
    }
    
}
Parameters params = new Parameters();
FileBasedConfigurationBuilder<Configuration> builder =
    new FileBasedConfigurationBuilder<Configuration>(PropertiesConfiguration.class)
    .configure(params.properties()
        .setFileName("project.properties")
        .setIOFactory(new CustomIOFactory());
Configuration config = builder.getConfiguration();
builder.save();
于 2021-06-02T06:41:38.857 に答える