在读取和写入文件时避免松开换行符(\ n)

时间:2012-05-07 16:09:30

标签: java file-io properties line-breaks

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

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

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

阅读后,我比较它们,并将缺少的密钥与模板文件中的值一起写入Set。

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”。

有谁知道我怎么能避免这种情况?

6 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分: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();
    }
}

答案 2 :(得分: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();

答案 3 :(得分:0)

你需要这样的东西:

"test.key=Hello\\nWorld!"

"\\n"实际上是\n

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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