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

Java 如何在不覆盖整个文件的情况下覆盖.properties中的一个属性?,java,properties,fileoutputstream,Java,Properties,Fileoutputstream,基本上,我必须通过Java应用程序覆盖.properties文件中的某个属性,但当我使用properties.setProperty()和properties.Store()时,它会覆盖整个文件,而不仅仅是一个属性 我尝试过用append=true构造FileOutputStream,但使用它会添加另一个属性,并且不会删除/覆盖现有属性 如何对其进行编码,以便设置一个属性会覆盖该特定属性,而不会覆盖整个文件 编辑:我尝试读取文件并添加到其中。以下是我的更新代码: FileOutputStream

基本上,我必须通过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();

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