【问题标题】:Trouble printing a multiple-line String with PrintWriter into a File [duplicate]使用 PrintWriter 将多行字符串打印到文件中时遇到问题 [重复]
【发布时间】:2014-08-15 10:27:11
【问题描述】:

我正在尝试将多行字符串打印到 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”可以正常工作!

【问题讨论】:

  • 你怎么看文件内容?您使用的是什么操作系统?您是否知道不同的操作系统会将不同的字符视为换行符?
  • 当您看到20 0 1 string10 2 1string2 时,您使用的是什么平台,您使用什么编辑器查看文件?
  • 我不知道不同操作系统使用不同的分隔符,但我总是在 w7 中使用 "\n" 并且效果很好。我用记事本打开了文本文件,然后使用 Bluej 进行编码。
  • 另外,在 Windows 上,标准分隔符是 \r\n,换句话说,CR LF

标签: java string printwriter


【解决方案1】:

如果您想在 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")

【讨论】:

  • 最后两行不应该是%n,而不是%%n吗?那么String.format("2%n0 0 1 string1%n0 2 1 string2") 不再需要d 了吗?
  • @davidwallace 我从链接的问题中抓住了这一点。如果我测试并且它是错误的,我会稍后更新。不过我删除了 d。
  • 是的,您从中得到的答案是“使用%n”。看来你看错了。
  • @DavidWallace,我刚拿到我的电脑并对其进行了测试,你是对的。我的答案现在已通过更正进行了编辑。看来我误读了答案中的示例。
【解决方案2】:

来自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);}

【讨论】:

  • @JoanPuicgerver:请考虑 \r\n 只是 Windows 的正确行终止符。不要不必要地引入操作系统依赖项。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-25
  • 2014-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多