【问题标题】:Why does \n and (String)System.getProperty("line.separator"); act differently? [duplicate]为什么 \n 和 (String)System.getProperty("line.separator");采取不同的行动? [复制]
【发布时间】:2016-02-03 23:59:27
【问题描述】:

我的程序接受一个文本文件的输入,其中每个单词由换行符分隔,我的程序接受它并处理数据,然后我需要在保持控制台输出的同时输出到一个新文件。

现在我想知道为什么当我将“\n”附加到我的 stringBuilder 时,它会像在控制台中有一个新行一样将其打印出来,但在文件输出中,它不会将其视为新行行,然后将所有单词放在一行中。

当我使用 newLine 时,它​​只会在我的控制台输出和输出文件中给出一个新行。这是为什么? (String)System.getProperty("line.separator") 是怎么做的?

String newLine = (String)System.getProperty("line.separator");

 try{
     BufferedReader fileIn = new BufferedReader(new FileReader(fileName));

     stringBuilder.append(newLine);
     while((s = fileIn.readLine()) != null){
        stringBuilder.append(s);
        stringBuilder.append(newLine);//using newLine, 
     }
        String a = stringBuilder.toString();

     if(s== null){
        fileIn.close();
     }

【问题讨论】:

  • 因为在某些系统上(想想 OSX 或 Windows),\n 不是行分隔符?
  • 你应该使用System.lineSeparator(),并且不需要将结果转换为String

标签: java string io system stringbuilder


【解决方案1】:

因为在某些系统(Linux/Unix)上新行定义为\n,而在其他系统(Windows)上定义为\r\n。根据读取文本的软件,它可能会选择坚持这一点,或者更加“宽容”地识别\r 或什至单独识别。

相关维基百科文字 (https://en.wikipedia.org/wiki/Newline):

基于 ASCII 或兼容字符集的系统使用 LF (换行,'\n',0x0A,十进制的 10)或 CR(回车,'\r', 0x0D,十进制的 13)单独或 CR 后跟 LF(CR+LF, '\r\n', 0x0D0A)

这也是为什么您可以像以前一样从System 类中检索系统定义的行分隔符,而不是例如在String 类中让它成为某个常量。

【讨论】:

  • 这个答案完全不正确。在 Windows 系统上,换行字符串是 \r\n,在 Unix 系统上是 \n(LF 或 ASCII 字符 10)。
  • @DarrellTeague 感谢您发现错误。我已经编辑了答案以反映。
【解决方案2】:

System.getProperty("line.separator")"\n" 的不同之处在于前者返回操作系统行分隔符(并非总是\n)。 \n 只是一个换行符,当您在​​不将 \n 解释为新行的程序中打开输出文件时(例如,Windows 上的记事本),您将看不到该新行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-16
    • 2013-01-07
    • 2020-05-16
    • 1970-01-01
    • 2019-02-12
    • 1970-01-01
    • 2011-03-31
    • 1970-01-01
    相关资源
    最近更新 更多