【问题标题】:Writing a .properties file in Java destroys the structure of the file在 Java 中编写 .properties 文件会破坏文件的结构
【发布时间】:2021-02-22 04:02:15
【问题描述】:

我可以使用此代码成功写入 Java .properties 文件:

Properties prop = new Properties();
prop.load(input);
prop.setProperty("myProp", "myValue");
prop.store(output, "");

但是当我查看我的.properties 文件时,所有结构都消失了!字段是按随机顺序写入的,所有的 cmets(我费了很大力气写)都被什么都覆盖了!

如何写入.properties 文件,同时确保其结构保持不变?

【问题讨论】:

  • 也许this可以帮助你?
  • 永远不要在没有备份或至少源代码控制的情况下重写您手动编写的文件。
  • @Renato 同意。这就是为什么我两者都有。
  • 要按顺序编写它们,另请参阅How can I write Java properties in a defined order?
  • 请在您的问题中包含一个示例属性文件,并说明您希望将新的、以前不存在的属性放在哪里,例如到文件的末尾。在任何情况下,开箱即用的 cmets 在读取属性文件时都会被丢弃。 Properties 类没有任何用于 cmets 的字段或 setter/getter 方法,因此该行为是意料之中的。您可以编写的唯一注释是整个文件的标题注释,在您的示例代码中您将其设置为空字符串。您必须通过增强的实现来扩展该类。

标签: java properties-file


【解决方案1】:

你可以使用Apache Commons Configuration 2:

<dependency>
  <groupId>org.apache.commons</groupId>
  <artifactId>commons-configuration2</artifactId>
  <version>2.1.1</version>
</dependency>

输入文件demo.properties:

# This is the file header
#
# Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna
# aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.

# Database user
db.user=admin

# Database password
db.password=password

# Database URL
db.url=localhost

# This is the file footer
#
# Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint
# occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

演示应用程序读取、修改和写入新的属性文件:

import org.apache.commons.configuration2.PropertiesConfiguration;
import org.apache.commons.configuration2.PropertiesConfigurationLayout;
import org.apache.commons.configuration2.ex.ConfigurationException;

import java.io.*;

class PropertiesFileWithCommentsDemo {
  public static void main(String[] args) throws IOException, ConfigurationException {
    // Load existing properties file
    File file = new File("demo.properties");
    PropertiesConfiguration config = new PropertiesConfiguration();
    PropertiesConfigurationLayout layout = new PropertiesConfigurationLayout();
    layout.load(config, new InputStreamReader(new FileInputStream(file)));

    // Print some information from the properties file
    System.out.println(layout.getHeaderComment());
    System.out.println(layout.getKeys());
    System.out.println(layout.getFooterComment());

    // Change existing property
    config.setProperty("db.password", "secret");

    // Add new property + comment + leading blank line
    config.setProperty("new.property", "Hello world!");
    layout.setComment("new.property", "This is a newly added property");
    layout.setBlancLinesBefore("new.property", 1);

    // Save to new properties file
    layout.save(config, new FileWriter("demo-append.properties", false));
  }
}

控制台日志:

# This is the file header
#
# Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna
# aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
[db.user, db.password, db.url]

# This is the file footer
#
# Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint
# occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

输出文件demo-append.properties:

# This is the file header
#
# Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna
# aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.

# Database user
db.user=admin

# Database password
db.password=secret

# Database URL
db.url=localhost

# This is a newly added property
new.property = Hello world!

# This is the file footer
#
# Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint
# occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

【讨论】:

  • 这正是我想要的,谢谢!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-15
  • 2021-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-22
相关资源
最近更新 更多