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));
}
}
另见:
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();