Java Properties反斜杠

时间:2011-04-26 01:07:24

标签: java properties

我正在使用Java Properties来读取属性文件。一切都运行良好,但属性默默地放下反斜杠。

(即)

original: c:\sdjf\slkdfj.jpg

after: c:sdjfslkdfj.jpg

如何让属性不这样做?

我正在使用代码prop.getProperty(key)

我从文件中获取属性,我想避免添加双反斜杠

9 个答案:

答案 0 :(得分:48)

Properties.load()导致你看到的问题是反斜杠用于特殊用途。

  

包含所有数据的逻辑行   对于一个关键元素对可以传播   穿过几个相邻的自然景观   通过转义行终止符行   带反斜杠字符的序列,   \。

如果您无法使用CoolBeans的建议,那么您可以做的是事先将属性文件读取到字符串并用双反斜杠替换反斜杠,然后将其提供给Properties.load()

String propertyFileContents = readPropertyFileContents();

Properties properties = new Properties();
properties.load(new StringReader(propertyFileContents.replace("\\", "\\\\")));

答案 1 :(得分:17)

使用双反斜c:\\sdjf\\slkdfj.jpg

Properties props = new Properties();
props.setProperty("test", "C:\\dev\\sdk\\test.dat");
System.out.println(props.getProperty("test"));    // prints C:\dev\sdk\test.dat

更新以下信用证 @ewh 。显然,Windows识别正斜杠。所以,我想你可以让你的用户用正斜杠写它,如果你之后需要反斜杠,你可以做一个替换。我在下面测试了这个片段,它运行正常。

Properties props = new Properties();
props.setProperty("test", "C:/dev/sdk/test.dat");
System.out.println(props.getProperty("test"));   // prints C:/dev/sdk/test.dat

答案 2 :(得分:10)

使用转发斜杠。 Java中从不需要在文件名中使用反斜杠。

答案 3 :(得分:6)

如果您确实需要在要加载的属性文件中使用反斜杠(例如,对于不是文件路径的属性)为每个反斜杠字符添加\u005c

反斜杠在属性文件中特别处理,如@unhillbilly提供的文档中所示。

@EJP:例如,如果您想在属性文件中存储NTLM登录ID,其中格式为DOMAIN\USERNAME并带有反斜杠,则肯定需要使用反斜杠。这种类型的属性一个文件名,因此正斜杠不起作用。

编辑:@Max Nanasy:来自上面提到的文件(java.util.Properties load javadoc)(强调我的)

  

在非有效转义字符作为错误之前,该方法不会将反斜杠字符'\'处理; 反斜杠被静默删除。例如,在Java字符串中,序列“\ z”将导致编译时错误。相反,这种方法会默默地删除反斜杠。因此,此方法将两个字符序列“\ b”视为等同于单个字符“b”

对我来说,我总是遇到属性文件中反斜杠的问题(即使使用双反斜杠'\\'),除非我指定了unicode。

答案 4 :(得分:2)

除了Bala R的答案之外,我还有以下解决方案,甚至可以将反斜杠的换行语义保留在一行的末尾。

这是我的代码:

private static Reader preparePropertyFile(File file) throws IOException {

    BufferedReader reader = new BufferedReader(new FileReader(file));
    StringBuilder result = new StringBuilder();

    String line;
    boolean endingBackslash = false;

    while ((line = reader.readLine()) != null) {
        line = line.trim();
        if (endingBackslash) {

            // if the line is empty, is a comment or holds a new property
            // definition the backslash found at the end of the previous
            // line is not for a multiline property value.
            if (line.isEmpty()
                    || line.startsWith("#")
                    || line.matches("^\\w+(\\.\\w+)*=")) {

                result.append("\\\\");
            }
        }

        // if a backslash is found at the end of the line remove it
        // and decide what to do depending on the next line.
        if (line.endsWith("\\")) {
            endingBackslash = true;
            line = line.substring(0, line.length() - 1);
        } else {
            endingBackslash = false;
        }
        result.append(line.replace("\\", "\\\\"));
    }
    if (endingBackslash) {
        result.append("\\\\");
    }
    return new StringReader(result.toString());
}

private static Properties getProperties(File file) throws IOException {
    Properties result = new Properties();
    result.load(preparePropertyFile(file));
    return result;
}

答案 5 :(得分:1)

\替换为\\,如下所示:

c:\sdjf\slkdfj.jpg 

c:\\sdjf\\slkdfj.jpg

答案 6 :(得分:0)

以下代码将有所帮助:

BufferedReader metadataReader = new BufferedReader(new InputStreamReader(new FileInputStream("migrateSchemaGenProps.properties")));
Properties props = new Properties();
props.load(new StringReader(IOUtils.getStringFromReader(metadataReader).replace("\\", "/")));

答案 7 :(得分:0)

在属性文件中使用反斜杠并不是一件好事,因为它们是转义字符。

尽管如此:Windows用户将倾向于在任何路径中使用它们...因此,在单行中感谢apache常见的IO:

params.load(new StringReader(IOUtils.toString(paramFile.toURI(), null).replaceAll("\\\\", "/")));

答案 8 :(得分:0)

你三次使用反斜杠来得到一个: 例如: 键=值1\\值2 在属性文件中将变成 键=值1\值2 在 java Properties 对象中