4

我阅读了几个属性文件,以将它们与缺少键的模板文件进行比较。

FileInputStream compareFis = new FileInputStream(compareFile);
Properties compareProperties = new Properties();
compareProperties.load(compareFis);

注意:我以同样的方式阅读模板文件。

阅读后,我比较它们并将缺少的键与模板文件中的值写入一个集合。

CompareResult result = new CompareResult(Main.resultDir);
[...]
if (!compareProperties.containsKey(key)) {
    retVal = true;
    result.add(compareFile.getName(), key + "=" + entry.getValue());
}

最后,我将丢失的键及其值写入一个新文件。

for (Entry<String, SortedSet<String>> entry : resultSet) {
    PrintWriter out = null;
    try {
        out = new java.io.PrintWriter(resultFile);
        SortedSet<String> values = entry.getValue();
        for (String string : values) {
            out.println(string);
        }
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } finally {
        out.flush();
        out.close();
    }
}

如果我打开结果文件,我会看到模板文件值中的所有换行符“\n”都被替换为新行。例子:

test.key=Hello\nWorld!

变成

test.key=Hello
World!

虽然这基本上是正确的,但就我而言,我必须保留“\ n”。

有谁知道我该如何避免这种情况?

4

6 回答 6

2

由于您的输出似乎是一个属性文件,因此您应该使用Properties.store()来生成输出文件。这不仅会处理换行符的编码,还会处理其他特殊字符(例如非 ISO8859-1 字符)。

于 2012-05-07T16:15:26.123 回答
1

使用println将使用特定于平台的行终止符结束每一行。您可以改为明确编写所需的行终止符:

for (Entry<String, SortedSet<String>> entry : resultSet) {
    PrintWriter out = null;
    try {
        out = new java.io.PrintWriter(resultFile);
        SortedSet<String> values = entry.getValue();
        for (String string : values) {
            out.print(string); // NOT out.println(string)
            out.print("\n");
        }
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } finally {
        out.flush();
        out.close();
    }
}
于 2012-05-07T16:16:24.910 回答
1

使用Properties.store()将示例添加到 JB Nizet 答案(我认为最好的 )

    FileInputStream compareFis = new FileInputStream(compareFile);
    Properties compareProperties = new Properties();
    compareProperties.load(compareFis);

 ....

    StringBuilder value=new StringBuilder();
    for (Entry<String, SortedSet<String>> entry : resultSet) {

            SortedSet<String> values = entry.getValue();
            for (String string : values) {
                value.append(string).append("\n");
            }
    }
    compareProperties.setProperty("test.key",value);
    FileOutputStream fos = new FileOutputStream(compareFile);
    compareProperties.store(fos,null);
    fos.close();
于 2012-05-07T16:39:27.100 回答
0

你需要这样的东西:

"test.key=Hello\\nWorld!"

"\\n"实际上在哪里\n

于 2012-05-07T16:12:33.333 回答
0

在序列化之前转义 \n。如果您打算读取输出文件的内容,您的阅读代码将需要注意转义。

于 2012-05-07T16:13:37.767 回答
0

您还可以查看 Apache Commons StringEscapeUtils.escapeJava( String )。

于 2012-05-07T16:20:53.353 回答