Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 更新属性文件的更好类?_Java_Properties - Fatal编程技术网

Java 更新属性文件的更好类?

Java 更新属性文件的更好类?,java,properties,Java,Properties,虽然java.util.properties允许读取和写入属性文件,但写入时不会保留格式。这并不奇怪,因为它没有绑定到属性文件 是否有一个PropertyFile类,或者类似的类,可以保留注释和空行,并在适当的位置更新属性值?您可以查看包含该类的。 但是,由于我从未使用过它,我不知道它是否保留了注释和格式 但是,值得一试…我曾经看到一个类可以用INI文件来实现这一点,但现在再也找不到链接了。如果你找不到别的东西,你可以试试。我编写这个XML解析器的具体设计目标是100%保留原始格式(即使用注释、

虽然
java.util.properties
允许读取和写入属性文件,但写入时不会保留格式。这并不奇怪,因为它没有绑定到属性文件


是否有一个
PropertyFile
类,或者类似的类,可以保留注释和空行,并在适当的位置更新属性值?

您可以查看包含该类的。 但是,由于我从未使用过它,我不知道它是否保留了注释和格式


但是,值得一试…

我曾经看到一个类可以用INI文件来实现这一点,但现在再也找不到链接了。如果你找不到别的东西,你可以试试。我编写这个XML解析器的具体设计目标是100%保留原始格式(即使用注释、元素中或根元素周围的奇怪空格、所有内容)


在解析生成的XML文档期间,您只需记住包含选项值的元素,并替换其中的文本节点。当您保存时,任何未更改的内容都不会以任何方式更改。

它没有比Apache的Commons API好多少。这提供了从属性文件、XML、JNDI、JDBC数据源等进行配置的统一方法

它对属性文件的处理非常好。它允许您从属性生成一个对象,该对象尽可能保留有关属性文件的信息(空格、注释等)。将更改保存到属性文件时,这些更改将尽可能保留


示例代码:

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStreamReader;

import org.apache.commons.configuration.ConfigurationException;
import org.apache.commons.configuration.PropertiesConfiguration;
import org.apache.commons.configuration.PropertiesConfigurationLayout;

public class PropertiesReader {
    public static void main(String args[]) throws ConfigurationException, FileNotFoundException {
        File file = new File(args[0] + ".properties");

        PropertiesConfiguration config = new PropertiesConfiguration();
        PropertiesConfigurationLayout layout = new PropertiesConfigurationLayout(config);
        layout.load(new InputStreamReader(new FileInputStream(file)));

        config.setProperty("test", "testValue");
        layout.save(new FileWriter("path\\to\\properties\\file.properties", false));
    }
}
另见:


使用Patrick Boos提供的Apache Commons配置库的示例代码非常复杂。除非需要对输出进行高级控制,否则不需要显式使用PropertiesConfiguration布局。属性配置本身足以保留注释和格式:

PropertiesConfiguration config = new PropertiesConfiguration("myprops.properties");
config.setProperty("Foo", "Bar");
config.save();

(注意:此代码适用于现有的1.10稳定版本。我没有检查它是否适用于当前可用的2.0 alpha版本。)

configuration2类有不同的语法。下面是一个使用它们的示例:

import org.apache.commons.configuration2.PropertiesConfiguration;
import org.apache.commons.configuration2.PropertiesConfigurationLayout;

public void test() {
    PropertiesConfiguration config = new PropertiesConfiguration();
    PropertiesConfigurationLayout layout = new PropertiesConfigurationLayout();
    config.setLayout(layout);
    layout.load(config, new FileReader("config.properties"));

    config.setProperty("KEY", "VALUE");
    StringWriter stringWriter = new StringWriter();
    layout.save(config, stringWriter);
    LOG.debug("Properties:\n{}", stringWriter.toString());
}

最佳答案包含一个小错误: 该行:

PropertiesConfigurationLayout layout = new PropertiesConfigurationLayout(config);
必须替换为:

PropertiesConfigurationLayout layout = config.getLayout();

这是对Jince Martin的回应,他在写入的属性文件中遇到了尾随空格的问题,例如key=value而不是key=value


您可以调用layout.setGlobalSeparator(“=”)来解决这个问题。

根据文档,一个“PropertiesConfiguration布局”类将保留格式和注释。这非常有效,并将注释保留在那里。冒昧添加了一些示例代码:)提供的代码无法编译。。propsFile未声明如果您有一个像Spring.Names=cookie@这样的键值该怎么办!罐子!!约翰逊!!詹姆斯!!绿色!!帕特里克。你怎么在patrick后面加上Jimmy?这很有效。但问题是,我们在key=value对中的“=”后面有一个空格,这是不需要的。因为我有价值,不需要空间。例如:test=xyz是属性文件中的值。但是在运行上述代码之后,我得到test=xyz。在“xyz”之前我不需要空格。我的评论可能有点太晚了,但您可以始终使用
trim()
删除不需要的空格。这很有效。但问题是,我们在key=value对中的“=”后面有一个空格,这是不需要的。因为我有价值,不需要空间。例如:test=xyz是属性文件中的值。但是在运行上述代码之后,我得到test=xyz。在“xyz”之前我不需要空格。它不适用于2.1.1版,除了setProperty之外,这些方法不存在。我很好奇为什么他们删除了如此优雅的方法,比如
save()
…:(如果这是对某件事的回应,请将其作为评论而不是单独的回答。@DerekC。这需要50点声誉积分。他们也应该等到可以的时候再加上。)。
PropertiesConfigurationLayout layout = config.getLayout();