【问题标题】:Spring app - persisting key/value to properties file without escapingSpring应用程序 - 将键/值持久保存到属性文件而不转义
【发布时间】:2018-05-16 06:45:52
【问题描述】:

我有一个 Spring 应用程序(独立的,而不是 WebApp),我正在尝试编写一个方法来将新的键/值对持久保存到 application.properties 。 这就是我所做的:

public static void AddUpdateAppSettings(String key, String value) {

    File f = new File("application.properties");

    try {
        Properties props = new Properties();
        props.load(new FileInputStream(f));
        props.setProperty(key, value);

        OutputStream out = new FileOutputStream(f);
        DefaultPropertiesPersister p = new DefaultPropertiesPersister();
        p.store(props, out, "Updated by application");
    } catch (Exception e) {
        Console.WriteLine("Error writing app settings");
    }
}

我似乎无法解决的两个问题是:

  1. 所有空行都被删除(微不足道)
  2. 值在读/写过程中被“转义”,例如处理后process.ClusterPrefix=####的值变成process.ClusterPrefix=\#\#\#\#

我也尝试过不使用DefaultPropertiesPersister,即只调用props.store(out,"");,结果相同

我是否需要对 InputStream 进行预处理,或者有什么方法可以关闭转义?空行呢?

编辑 如前所述,当它对称时,转义并没有什么害处,但是 这个文件应该是人工可编辑的,当读/写过程将process.backupPath=C:\Temp\Backup转换为process.backupPath=C\:TempBackup时很难

【问题讨论】:

  • Console.WriteLine 是java吗? :)
  • 是的 - 你抓住了我 - 我写了一些简单的静态函数来使代码更适合来自 C# 的其他开发人员:)

标签: java spring properties-file


【解决方案1】:

基于docs

以注释字符 !# 开头的行将被忽略。 空白行也会被忽略。
如果每行都以反斜杠 (‘\’) 字符结尾,则属性值可以跨越多行。
反斜杠字符必须转义为双反斜杠。
字符 newline、回车和制表符可以分别插入字符 \n、\r 和 \t。

所以 # 是 Java 属性的系统字符,如果要在其中存储带有 # 的键或值,则需要转义这个字符。

而且不用担心,读取该属性后,该值不会包含转义字符。

保存属性:

 props.setProperty("test#key", "test#value");

application.properties保存后的内容:

test\#key=test\#value

以及读取后的值:

String value = props.getProperty("test#key");
System.out.println(value); // test#value

【讨论】:

  • 好的,但是转义还有其他问题。这个文件应该是人工可编辑的,当读/写过程将process.backupPath=C:\Backup转换为process.backupPath=C:Backup时很难
  • @Black \ 符号也必须转义:) 如果需要手动编辑属性文件,您可以手动转义这些符号。或者你可以使用jboss tools properties editor 之类的东西,或者你自己的应用程序会做同样的事情(转义坏字符)
  • 所以,总而言之,Java 中没有合理的编程方式来避免这两个问题?
  • @Black 是的,你不能用转义字符存储值而不转义它们。
  • 好吧,我可以停止使用 Properties 并创建自己的文本属性读取器/写入器。如果 Properties 允许覆盖其格式规则,我只是不想这样做
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-16
  • 1970-01-01
  • 2019-06-25
  • 1970-01-01
  • 2011-09-08
相关资源
最近更新 更多