如何在不覆盖整个文件的情况下覆盖 .properties 中的一个属性?

新手上路,请多包涵

基本上,我必须通过 Java 应用程序覆盖 .properties 文件中的某个属性,但是当我使用 Properties.setProperty() 和 Properties.Store() 时,它会覆盖整个文件而不仅仅是那个属性。

我已经尝试使用 append = true 构建 FileOutputStream,但是它添加了另一个属性并且不会删除/覆盖现有属性。

我如何编写代码以便设置一个属性覆盖该特定属性,而不覆盖整个文件?

编辑:我尝试读取文件并添加到其中。这是我更新的代码:

 FileOutputStream out = new FileOutputStream("file.properties");
FileInputStream in = new FileInputStream("file.properties");
Properties props = new Properties();

props.load(in);
in.close();

props.setProperty("somekey", "somevalue");
props.store(out, null);
out.close();

原文由 user890704 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 941
2 个回答

Properties API 不提供任何在属性文件中添加/替换/删除属性的方法。 API 支持的模型是从一个文件加载所有属性,对内存中的对象 Properties 对象进行更改,然后将所有属性存储到一个文件(相同的或不同的一)。

但是 Properties API 在这方面并不罕见。实际上,如果不重写整个文件,很难实现文本文件的就地更新。这种困难是现代操作系统实现文件/文件系统的方式的直接结果。

如果你真的需要进行增量更新,那么你需要使用某种数据库来保存属性,而不是“.properties”文件。


其他答案以各种形式建议了以下方法:

  1. 将文件中的属性加载到 Properties 对象中。
  2. 更新 Properties 对象。
  3. 在现有文件之上保存 Properties 对象。

这适用于某些用例。然而,加载/保存可能会重新排序属性,删除嵌入的注释和空白。这些事情 可能 很重要1 。

另一点是,这涉及重写整个属性文件,OP 明确尝试2避免这种情况。


1 - 如果 API 是按照设计者的意图使用的,那么属性顺序、嵌入注释等都 _无关紧要_。但是让我们假设 OP 出于“务实原因”这样做。

2 - 并不是说避免这种情况是 可行 的;早点看。

原文由 Stephen C 发布,翻译遵循 CC BY-SA 4.0 许可协议

您可以使用 Apache Commons Configuration 中的 PropertiesConfiguration。

在版本 1.X 中:

 PropertiesConfiguration config = new PropertiesConfiguration("file.properties");
config.setProperty("somekey", "somevalue");
config.save();

从 2.0 版开始:

 Parameters params = new Parameters();
FileBasedConfigurationBuilder<FileBasedConfiguration> builder =
    new FileBasedConfigurationBuilder<FileBasedConfiguration>(PropertiesConfiguration.class)
    .configure(params.properties()
        .setFileName("file.properties"));
Configuration config = builder.getConfiguration();
config.setProperty("somekey", "somevalue");
builder.save();

原文由 davidpolo 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题