Java 如何在属性文件中转义冒号(:)?
我正在使用属性文件来存储应用程序的配置值。 在其中一个实例中,我必须将值存储为Java 如何在属性文件中转义冒号(:)?,java,properties,escaping,key-value,colon,Java,Properties,Escaping,Key Value,Colon,我正在使用属性文件来存储应用程序的配置值。 在其中一个实例中,我必须将值存储为 xxx:yyy:zzz。当我这样做时,冒号用反斜杠转义\,结果在属性文件中显示为xxx\:yyy\:zzz 我知道冒号:是PropertiesJava类的标准分隔符。但是,我仍然需要保存不带反斜杠的值\ 有关如何处理此问题的任何建议?如果使用属性文件的xml变量(使用loadFromXML和storeToXML),这应该不是问题。将属性放入属性对象,并使用存储(…)方法保存它。该方法将执行所需的任何转义。报告说: “
xxx:yyy:zzz
。当我这样做时,冒号用反斜杠转义\
,结果在属性文件中显示为xxx\:yyy\:zzz
我知道冒号:
是Properties
Java类的标准分隔符。但是,我仍然需要保存不带反斜杠的值\
有关如何处理此问题的任何建议?如果使用属性文件的xml变量(使用
loadFromXML
和storeToXML
),这应该不是问题。将属性放入属性
对象,并使用存储(…)
方法保存它。该方法将执行所需的任何转义。报告说:
“…对于键,所有空格字符都使用前一个\字符写入。对于元素,前导空格字符(而不是嵌入或尾随空格字符)使用前一个\字符写入。键和元素字符#、!、=、和:使用前一个反斜杠写入,以确保正确加载。”
如果手动创建/写入文件,则只需手动转义字符
相反,如果您希望文件包含未替换的冒号字符,那么您就运气不佳。这样的文件格式不正确,可能无法使用
Properties.load(…)
方法正确加载。如果你走这条路,你将需要实现你自己的定制加载和/或存储方法。我们几天前碰到了这个问题。我们使用URL作为值来操作现有的属性文件
这是有风险的,但如果属性值少于40个字符,则可以使用“列表”方法而不是“存储”:
我们快速查看了JDK代码,并开发了一个自定义的store实现,该实现可用于我们的目的:
public void store(Properties props, String propertyFilePath) throws FileNotFoundException {
PrintWriter pw = new PrintWriter(propertyFilePath);
for (Enumeration e = props.propertyNames(); e.hasMoreElements();) {
String key = (String) e.nextElement();
pw.println(key + "=" + props.getProperty(key));
}
pw.close();
}
我遇到了同样的问题。前斜杠
/
也可以通过属性中的存储()
方法进行转义
我通过创建自己的CustomProperties
类(扩展java.util.Properties
)并注释customStore0()
方法中对saveConvert()
的调用,解决了这个问题
这是我的CustomProperties
课程:
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.util.Date;
import java.util.Enumeration;
import java.util.Properties;
public class CustomProperties extends Properties {
private static final long serialVersionUID = 1L;
@Override
public void store(OutputStream out, String comments) throws IOException {
customStore0(new BufferedWriter(new OutputStreamWriter(out, "8859_1")),
comments, true);
}
//Override to stop '/' or ':' chars from being replaced by not called
//saveConvert(key, true, escUnicode)
private void customStore0(BufferedWriter bw, String comments, boolean escUnicode)
throws IOException {
bw.write("#" + new Date().toString());
bw.newLine();
synchronized (this) {
for (Enumeration e = keys(); e.hasMoreElements();) {
String key = (String) e.nextElement();
String val = (String) get(key);
// Commented out to stop '/' or ':' chars being replaced
//key = saveConvert(key, true, escUnicode);
//val = saveConvert(val, false, escUnicode);
bw.write(key + "=" + val);
bw.newLine();
}
}
bw.flush();
}
}
很简单,,
只要在那边用撇号就行了
例如:
而不是这个(案例1)
使用此选项(案例2)
输出将是
案例1:basedir=f:\properties\gog\esave\apple
案例2:basedir=f:\properties\gog\esave\apple
我希望这将帮助您尝试使用unicode。
冒号的unicode是\u003A
此外,空间的unicode是:\u0020
有关基本拉丁字符的列表,请参见:
例如:
ProperName\u003A\name continues=某些属性值
将需要具有密钥的属性:
ProperName:NameContinues
其价值为:
一些属性值
对我来说,它通过在特殊字符之前使用\
来工作
e、 g,
:
用\:
和
(空格)转义为\
(\
后跟)
有关更多信息:对于像我这样在使用Spring Boot配置属性文件时来到这里的人:您需要在[…]
中附上:
例如:
这还不够,您需要在应用程序中使用它。属性
例如:
my.[test\:key]=value
另请参见恐怕您不能。否则,如何在不混淆“您的”冒号和冒号用于分隔键值的情况下读回属性文件?制作一个StringWriter,将属性文件写入其中,逐行检查缓冲区,查找“\:”
,并将其替换为单个“:”
。这并不漂亮,但你要做的也不是很漂亮。@BhavikAmbani“使用正则表达式”是怎么做到的?在保存属性文件时,您究竟从哪里获得了指定正则表达式的机会,以及RE究竟是什么样子的?我也喜欢这种方法,但XML格式对于noobs(“客户等”)来说更难阅读。。。我认为应该有一种方法来转义:,或者使用一些util来选择键值分隔符,就像现在一样:,也被用作分隔符……您可能想要修复复制的打字错误,'flie'而不是'file'oopsy
File file= new File("f':'\\properties\\gog\\esave\\apple");
prop.setProperty("basedir",file.toString());
Before: VCS\u003aIC\u0020Server\u003a=Migration
After: VCS\:IC\ Server\:=Migration
my.test\:key=value
my.[test\:key]=value