Java-写入文件时按字面意义使用转义的反斜杠

时间:2019-06-11 15:34:47

标签: java string escaping

我想将URL存储在属性文件中。这是URL:

jdbc\:sqlserver\://dummydata\\SHARED

在用Java编程时,我显然需要转义反斜杠。所以我的代码最终看起来像这样

properties.setProperty("db", "jdbc\\:sqlserver\\://dummydata\\\\SHARED");

此问题是属性文件正在保存字符串URL,并包括用于转义的反斜杠,这是一个错误的URL。我希望Java能够解释用于转义的反斜杠,以便仅保存正确的URL。有没有办法做到这一点?

3 个答案:

答案 0 :(得分:3)

您正确的认为,带有:的属性值需要转义.properties 文本文件中的冒号,但是您不是直接写该文本文件。

您正在使用Properties将值赋予setProperty()对象,并可能使用store()和{{1将其值写入文本文件 }}方法将根据需要转义值

您应该为store()提供所需的值,而忘记文本文件的编码规则。 Properties将处理所有需要的编码。由于您要提供的值为Properties,因此您要编写字符串文字 jdbc:sqlserver://dummydata\SHARED

示例

"jdbc:sqlserver://dummydata\\SHARED"

输出

String db = "jdbc:sqlserver://dummydata\\SHARED";
System.out.println(db); // To see actual string value

Properties properties = new Properties();
properties.setProperty("db", db);
try (FileWriter out = new FileWriter("test.properties")) {
    properties.store(out, null);
}

test.properties的内容

jdbc:sqlserver://dummydata\SHARED

如您所见,#Tue Jun 11 11:54:24 EDT 2019 db=jdbc\:sqlserver\://dummydata\\SHARED 方法为您转义了store():


如果将属性另存为XML文件,则无需转义任何内容,\不会。

示例

Properties

test.xml的内容

try (FileOutputStream out = new FileOutputStream("test.xml")) {
    properties.storeToXML(out, null);
}

答案 1 :(得分:0)

Properties.store()会转义反斜线,因此无法解决。我想我的第一个问题是为什么这是个问题?您是否要使用Properties.load()以外的其他方式读取文件。如果不是这样,您就不必担心,因为加载功能将删除转义符。

   properties.load(file);
   System.out.println(properties.get("db")); 
   // output: jdbc\:sqlserver\://dummydata\\SHARED

顺便说一句,您确定URL正确吗?您不应该将其存储为properties.setProperty("jdbc:sqlserver://dummydata\SHARED")吗?

答案 2 :(得分:-1)

load的{​​{3}}中,它表示以下内容:

  

该方法不会在无效的转义字符之前将反斜杠字符\视为错误;反斜杠默默地掉了下来。例如,在Java字符串中,序列“ \ z”将导致编译时错误。相反,此方法会静默删除反斜杠。因此,此方法将两个字符序列“ \ b”等同于单个字符“ b”。

这意味着两个反斜杠将被视为一个反斜杠,因为它不是有效的转义序列。加载该字符串应该可以正常工作:

C:\\path\\to\\file