2014-06-25 51 views
0

我试图将多行字符串打印到PrintWriter中,但它不能识别不同的行。无法用PrintWriter将多行字符串打印到文件中

我有这个字符串:“2 \ n0 0 1 string1 \ n0 2 1 string2”。

我预计将有到该文件中的文本是:

2 
0 0 1 string1 
0 2 1 string2 

,但它实际上是:

20 0 1 string10 2 1string2 

我的代码是:

public void save(String str){ 
    try{ 
     PrintWriter out = new PrintWriter("file.txt"); 
     out.println(str); 
     out.close(); 
     System.out.print(str); 
    }catch(Exception e){System.out.println(e);} 
} 

它打印OK的安慰。

我正在使用BlueJ进行编码。我的操作系统是W7,我用记事本打开了文件。

已解决!

使用“\ r \ n”而不是“\ n”正常工作!

+1

你如何看待文件内容?你在使用什么操作系统?您是否知道不同的操作系统将不同的字符视为新的行分隔符? –

+3

当你看到'20 0 1 string10 2 1string2'时,你在使用什么平台,以及你在看什么编辑器? –

+0

我并不知道不同的操作系统使用不同的分隔符,但我总是在w7中使用“\ n”,它运行良好。我用记事本打开了文本文件,然后使用Bluej进行编码。 – Joan

回答

1

PrintWriter.println()的Javadoc,

由写入行分隔符字符串终止当前行。行分隔符字符串由系统属性line.separator定义,不一定是单个换行符('\ n')。

所以,我认为你可以使用 -

try{ 
    PrintWriter out = new PrintWriter("file.txt"); 
    for (String s : str.split("\n")) { 
    out.println(s); 
    } 
    out.close(); 
    System.out.print(str); 
}catch(Exception e){System.out.println(e);} 
+2

@JoanPuicgerver:请认为'\ r \ n'只是windows的正确行结束符。不要不必要地介绍操作系统依赖关系。 – Deduplicator

3

如果你想代表在Windows上的文字换行,你需要使用\r\n,这是该平台的标准分隔符。

换句话说,你原来的字符串需要

"2\r\n0 0 1 string1\r\n0 2 1 string2" 

不过,这很快就变得不可移植的,所以你应该不是为标准的分隔符查询,然后再使用它来构建你的字符串。

String d = System.getProperty("line.separator"); 
String mystr = String.format("2%s0 0 1 string1%s0 2 1 string2", d, d) 

此外,基于this answer,我们可以用%n格式说明,以避免调用getProperty()

String mystr = String.format("2%n0 0 1 string1%n0 2 1 string2") 
+0

最后两行不应该是'%n',而不是'%% n'?所以'String.format(“2%n0 0 1 string1%n0 2 1 string2”)'不需要'd'吗? –

+0

@davidwallace我从链接的问题中抓住了它。如果我测试并且它是错误的,我会稍后更新。我虽然删除了d。 – merlin2011

+0

是的,你从那个答案中说“使用'%n'”。看来你误解了它。 –