public static String escapePropertyValue(final String value) {
if (value == null) {
return null;
}
try (final StringWriter writer = new StringWriter()) {
final Properties properties = new Properties();
properties.put("escaped", value);
properties.store(writer, null);
writer.flush();
final String stringifiedProperties = writer.toString();
final Pattern pattern = Pattern.compile("(.*?)escaped=(.*?)" + Pattern.quote(System.lineSeparator()) + "*");
final Matcher matcher = pattern.matcher(stringifiedProperties);
if (matcher.find() && matcher.groupCount() <= 2) {
return matcher.group(matcher.groupCount());
}
// This should never happen unless the internal implementation of Properties::store changed
throw new IllegalStateException("Could not escape property value");
} catch (final IOException ex) {
// This should never happen. IOException is only because the interface demands it
throw new IllegalStateException("Could not escape property value", ex);
}
}
你可以这样称呼它:
final String escapedPath = escapePropertyValue("C:\\Users\\X");
writeToFile(escapedPath); // will pass "C\\:\\\\Users\\\\X"
9条答案
按热度按时间mefy6pfw1#
在你的例子中,你不需要转义等于,你只需要转义它,如果它是键的一部分.属性文件格式会把第一个未转义的等于之后的所有字符作为值的一部分.
xzlaal3s2#
另外,请参考javadoc上
Property
类的**load(Reader reader)**方法在
load(Reader reader)
方法文档中,它表示关键字包含该行中从第一个非空白字符开始直到(但不包括)第一个未转义的
'='
、':'
或除行终止符以外的空白字符的所有字符。所有这些关键字终止字符都可以通过使用前面的反斜杠字符进行转义而包含在关键字中;例如,可能是两个字符的键
":=".
可以使用\r
和\n
转义序列包括行终止符。键后的任何空格都将被跳过;如果关键字后的第一个非空白字符是'='
或':'
,则忽略该关键字,并跳过其后的所有空白字符,该行上的所有剩余字符都成为相关元素字符串的一部分;如果没有剩余字符,则元素是空字符串""
,一旦确定了构成关键字和元素的原始字符串,就如上所述执行换码处理。uxhixvfz3#
Java中默认的转义字符是“\”。
然而,Java属性文件有格式key=value,它应该考虑第一个equal之后的所有内容作为value。
crcmnpdw4#
避免这类问题的最佳方法是以编程方式构建属性,然后存储它们。例如,使用如下代码:
这将向System.out输出正确转义的版本。
在我的例子中,输出是:
正如你所看到的,这是一种生成.properties文件内容的简单方法,而且你可以根据自己的需要放置任意多的属性。
cedebl8k5#
在我的情况下,两个前导的"\"对我来说很好。
例如:如果单词包含'#'字符(例如aa#100,您可以使用两个前导'\'对其进行转义
xxe27gdn6#
您可以查看此处Can the key in a Java property include a blank character?
转义等于'=' \u003d
表。其中子句=其中ID=100
键:[表.所在子句]值:[其中ID=100]
表格.位置条件其中id=100
键:[表.位置子句=其中]值:[ID=100]
表格.位置子句位置
键:[表.位置子句=其中ID=100]值:[]
zbsbpyhn7#
在Spring或Sping Boot 的application.properties文件中这里是特殊字符的转义方法;
表。其中子句=其中ID '=' 100
nhjlsmyf8#
此方法应有助于以编程方式生成保证与
.properties
文件100%兼容的值:你可以这样称呼它:
这种方法有点昂贵,但是,将属性写入文件通常是一个零星的操作。
n6lpvg4x9#
我已经能够在字符“”内输入值: