Java 如何在不覆盖整个文件的情况下覆盖.properties中的一个属性?
基本上,我必须通过Java应用程序覆盖.properties文件中的某个属性,但当我使用properties.setProperty()和properties.Store()时,它会覆盖整个文件,而不仅仅是一个属性 我尝试过用append=true构造FileOutputStream,但使用它会添加另一个属性,并且不会删除/覆盖现有属性 如何对其进行编码,以便设置一个属性会覆盖该特定属性,而不会覆盖整个文件 编辑:我尝试读取文件并添加到其中。以下是我的更新代码:Java 如何在不覆盖整个文件的情况下覆盖.properties中的一个属性?,java,properties,fileoutputstream,Java,Properties,Fileoutputstream,基本上,我必须通过Java应用程序覆盖.properties文件中的某个属性,但当我使用properties.setProperty()和properties.Store()时,它会覆盖整个文件,而不仅仅是一个属性 我尝试过用append=true构造FileOutputStream,但使用它会添加另一个属性,并且不会删除/覆盖现有属性 如何对其进行编码,以便设置一个属性会覆盖该特定属性,而不会覆盖整个文件 编辑:我尝试读取文件并添加到其中。以下是我的更新代码: 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();
Properties
API不提供在属性文件中添加/替换/删除属性的任何方法。API支持的模型是从一个文件加载所有属性,对内存中的属性对象进行更改,然后将所有属性存储到一个文件(相同或不同的文件)
但是Properties
API在这方面并不少见。实际上,如果不重写整个文件,很难实现文本文件的就地更新。这种困难是现代操作系统实现文件/文件系统方式的直接结果
如果确实需要进行增量更新,则需要使用某种数据库来保存属性,而不是“.properties”文件
其他答案以各种形式提出了以下方法:
将属性从文件加载到properties
对象中
更新属性
对象
将属性
对象保存在现有文件的顶部
这适用于某些用例。但是,加载/保存可能会对属性进行重新排序,删除嵌入的注释和空白。这些事情可能很重要
另一点是,这涉及重写整个属性文件,OP明确地试图避免重写
1-如果API按照设计人员的意图使用,那么属性顺序、嵌入注释等就无关紧要了。但让我们假设OP这样做是出于“务实的原因” 属性文件是为应用程序提供配置的一种简单方法,但不一定是进行编程、用户特定定制的好方法,原因就在于您已经找到了
为此,我将使用API。导入java.io.*
导入java.util.*
类writeProperties文件
{
}您可以从中使用属性配置
在版本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();
Parameters params=新参数();
基于文件的配置生成器=
新的FileBasedConfiguration Builder(PropertiesConfiguration.class)
.configure(params.properties()
.setFileName(“file.properties”);
Configuration config=builder.getConfiguration();
setProperty(“somekey”、“somevalue”);
builder.save();
我使用以下方法:-
读取文件并加载属性对象
使用“.setProperty”方法更新或添加新属性。(setProperty方法优于.put方法,因为它可以用于插入和更新属性对象)
将属性对象写回文件以使文件与更改保持同步
是的,这是可能的。如果不想从属性文件中删除内容。只需读取并替换文件中的字符串
String file="D:\\path of your file\abc.properties";
Path path = Paths.get(file);
Charset charset = StandardCharsets.UTF_8;
String content = new String(Files.readAllBytes(path), charset);
content = content.replaceAll("name=anything", "name=anything1");
Files.write(path, content.getBytes(charset));
上述代码不会从文件中删除内容。它只替换文件中的部分内容。如果您只想覆盖1 prop,为什么不向java命令添加参数呢。无论您在属性文件中提供什么,它们都将被属性参数覆盖
String file="D:\\path of your file\abc.properties";
Path path = Paths.get(file);
Charset charset = StandardCharsets.UTF_8;
String content = new String(Files.readAllBytes(path), charset);
content = content.replaceAll("name=anything", "name=anything1");
Files.write(path, content.getBytes(charset));
java -Dyour.prop.to.be.overrided="value" -jar your.jar
如果你读入属性,添加/更改一个属性,然后写出这些属性,所有属性都应该在那里——你能展示你尝试过的代码吗?@Dave Newton:是的,但它们的顺序不同。这是一个已知的问题。。。我想这就是OP真正想要的。@home:哦,我明白了。是的,我猜是无序收藏的诅咒。如果这是问题所在,不妨将其视为字符串,进行替换,然后将其写回。在那里,刚刚更新。同样的结果是,整个文件被覆盖。另一个答案让我想起了库,特别是它的功能。这允许(或多或少)保留原始布局、注释、顺序等。这是最好的解决方案。它保持属性文件的完整性;不要搞砸了。您需要更改:props.setProperty
-->config.setProperty
虽然这是一个实用的解决方案,但它不是OP要求的。具体来说,整个文件正在被重写/覆盖。从2.1.1版开始,不支持使用save()方法和构造函数。你有其他选择吗:)?但这正是OP想要避免的。它重写了整个属性文件。它不一样。它只是替换部分内容,而不是整个属性文件。您可以自己尝试。实际上,它正在重写整个文件。事实上,在某些情况下,它可能会丢弃文件。我可以想出4种不同的方式来实现这一点。(我不需要尝试。我可以阅读代码。)嗯,从各方面考虑,我认为这是一个糟糕/危险的解决方法。与其他人共享糟糕/危险的代码不是一个好主意。
String file="D:\\path of your file\abc.properties";
Path path = Paths.get(file);
Charset charset = StandardCharsets.UTF_8;
String content = new String(Files.readAllBytes(path), charset);
content = content.replaceAll("name=anything", "name=anything1");
Files.write(path, content.getBytes(charset));
java -Dyour.prop.to.be.overrided="value" -jar your.jar