基本上,我必须通过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();
9条答案
按热度按时间pkln4tw61#
Properties
API不提供任何在属性文件中添加/替换/删除属性的方法。API支持的模型是从文件加载所有属性,对内存中的Properties
对象进行更改,然后将所有属性存储到文件(相同或不同的文件)。但是
Properties
API在这方面并不罕见。实际上,如果不重写整个文件,很难实现文本文件的就地更新。这种困难是现代操作系统实现文件/文件系统的方式的直接后果。如果您确实需要进行增量更新,那么您需要使用某种数据库来保存属性,而不是“.properties”文件。
其他答复以各种形式提出了以下方法:
1.将属性从文件加载到
Properties
对象中。1.更新
Properties
对象。1.将
Properties
对象保存在现有文件的顶部。这适用于一些用例。但是,加载/保存可能会对属性重新排序,删除嵌入的注解和白色。这些事情可能很重要。
另一点是,这涉及重写整个属性文件,而OP明确地试图避免这一点。
1 -如果API按照设计者的意图使用,属性顺序、嵌入的注解等都无关紧要。但让我们假设OP这样做是出于“务实的原因”。
2 -不是说避免这种情况是 * 实际 * 的;看前面。
iaqfqrcu2#
您可以使用Apache Commons Configuration中的PropertyConfiguration。
在版本1.X中:
从版本2.0开始:
kjthegm63#
属性文件是为应用程序提供配置的一种简单方法,但不一定是进行编程的、特定于用户的自定义的好方法,原因正如您所发现的。
为此,我会使用Preferences API。
yyyllmsg4#
我使用以下方法:
1.读取文件并加载properties对象
1.使用“.setProperty”方法更新或添加新属性。(setProperty方法比.put方法更好,因为它可以用于插入和更新属性对象)
1.将属性对象写回文件以使文件与更改保持同步。
ssm49v7z5#
程序的输出将是:
guykilcj6#
请仅使用更新文件行,而不是使用属性,例如。
ktecyv1j7#
我知道这是一个老问题,但这是工作代码(从问题中的代码略有修改,以防止在加载之前删除值):
g6ll5ycj8#
如果你只是想覆盖1 prop,为什么不直接在java命令中添加参数呢?无论你在属性文件中提供什么,它们都会被属性参数覆盖。
ca1c2owp9#