在不删除其他属性值的情况下更新属性文件中的属性值

59

First.properties的内容:

name=elango
country=india
phone=12345

我想将countryindia更改为america。 这是我的代码:

import java.io.*;
public class UpdateProperty 
{
    public static void main(String args[]) throws Exception 
    {   
        FileOutputStream out = new FileOutputStream("First.properties");
        FileInputStream in = new FileInputStream("First.properties");
        Properties props = new Properties();
        props.load(in);
        in.close();
        props.setProperty("country", "america");
        props.store(out, null);
        out.close();
    } 
}

输出 First.properties 文件的内容:

country=america
其他属性已被删除。我希望更新特定的属性值,而不删除其他属性。

如何在不覆盖整个文件的情况下覆盖属性中的一个属性?有一个更好的类来更新属性文件吗? - Vadzim
3个回答

105

在关闭输入流之后,打开输出流并存储属性。

try (FileInputStream in = new FileInputStream("First.properties")) {
    Properties props = new Properties();
    props.load(in);
}
        
try (FileOutputStream out = new FileOutputStream("First.properties"))
    props.setProperty("country", "america");
    props.store(out, null);
}

1
不正确。我已经将代码添加到我的答案中。 - Vasyl Keretsman
@VasylKeretsman,它已经删除了文件中所有现有的注释。 - Paraneetharan Saravanaperumal
关闭流应该在finally块/try-with-resources语句中完成。 - Puce
也许您对这个属性库也感兴趣。它可以保留顺序和注释。 https://dev59.com/e3RB5IYBdhLWcg3wn4jc - Benjamin Peter
7
这如何成为被接受的答案?它会移除所有先前设置的属性。 - WowBow
显示剩余6条评论

35
你可以使用Apache Commons Configuration库。最好的部分是,它甚至不会弄乱属性文件并保持其完整性(即使是注释)。 Javadoc
PropertiesConfiguration conf = new PropertiesConfiguration("propFile.properties");
conf.setProperty("key", "value");
conf.save();    

7
这个答案比被采纳的那个更好。 - Joe Hackerberg
1
@GOXR3PLUS 很抱歉我现在无法测试它,但我认为它应该可以工作,因为网站头部有一个注释,你可以看到:"最后发布日期:2017年2月8日|版本:2.1.1"。虽然有点混乱,但你仍然可以使用旧版本。不幸的是,我不能再帮你了 :( - Joe Hackerberg
1
我之前使用的是1.1版本。 此外,2.1版本中包含了save()方法。 https://commons.apache.org/proper/commons-configuration/apidocs/org/apache/commons/configuration2/PropertiesConfiguration.html - AnirbanDebnath
1
嗨@J.Doem:您可以使用旧版本的1.10版本,它具有String args构造函数,可直接传递文件名。否则,对于V2,您可以使用PropertyConfiguration类的loadIncludeFile(String fileName)方法来传递文件名。 - AnirbanDebnath
1
这个解决方案解决了我的两个问题:
  1. 在不丢失其他数据的情况下保存文件
  2. 键的位置没有被交换(使用其他解决方案,如FileInput和Output流,键的位置会被随机交换,并且注释也会被删除)。
- Lakshmipathi G
显示剩余6条评论

10
Properties prop = new Properties();
prop.load(...); // FileInputStream 
prop.setProperty("key", "value");
prop.store(...); // FileOutputStream 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接