为什么 \n 和 (String)System.getProperty("line.separator"); 表现不同?

3
我的程序接受一个文本文件作为输入,该文件中的单词由换行符分隔。程序处理数据后,需要输出到一个新文件,同时保留控制台输出。
现在我想知道为什么当我将“\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();
     }

1
因为在某些系统上(例如OSX或Windows),\n不是行分隔符? - user180100
你应该使用 System.lineSeparator(),并且不需要将结果强制转换为 String - Manos Nikolaidis
2个回答

3
因为在某些系统(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)。 - Darrell Teague
@DarrellTeague 感谢您发现错误。我已经编辑了答案以反映出来。 - Brent C

1

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接