\n和\ r似乎无处不在.为什么line.separator更便携?

Wol*_*'08 8 java portability newline linefeed

我只是在仔细阅读问题,而且我发现System.getProperty(line.separator)用来代替\n作者的评论,代码是"可移植的".通过各种论坛阅读,我看到两组:

  1. 那些认为Linux和Windows对换行符的解释存在差异的人,这可以弥补这一点(没有明确的证据).
  2. 通过显示代码和输出示例来说没有区别的人,这显然只适用于该代码示例而不是普遍适用.

我的感觉是:它可能是非标准的操作系统,例如你公司的工业扫描仪的操作系统,你会注意到它的不同之处.我何时会看到\n和之间的区别line.separator?你能举个例子吗?你是如何发现变异发生的地方的?

Sam*_*ley 10

这是OS的标准行分隔符:

Windows: '\r\n'
Mac (OS 9-): '\r'
Mac (OS 10+): '\n'
Unix/Linux: '\n'
Run Code Online (Sandbox Code Playgroud)

这意味着如果您将行分隔符硬编码为\n,您将在Linux和OS X中获得预期的结果,但Windows将无法正确识别行结尾.但是,通过使用更通用line.separator的代表您的行结尾,他们将解决执行操作系统的行结束的预期实现可能发生的任何事情.


tha*_*guy 8

不正确的行尾是经常烦恼.例如,这是Windows Notepad在编写文件\n而不是\r\n(Windows'line.separator)时显示的内容:

记事本与框而不是换行符

那些小盒子应该是换行符.

反过来,当\r\n用来代替\n(Unix'line.separator)时,更糟糕的是,以奇怪和奇妙的方式打破shell脚本和配置文件.

例如,这是shDebian和派生的发行版在尝试运行刚包含ls但带有\r\n行分隔符的shell脚本时的输出(它看起来被删除,因为回车导致终端覆盖部分行):

: not foundsh: ls
Run Code Online (Sandbox Code Playgroud)

StackOverflow每天都有几个问题来自被人咬伤的人,比如这里,这里这里.


kes*_*lam 6

如果你弄错了,你就会搞砸你与其他应用程序交换数据的能力.您需要了解何时可以假设Java会帮助您......以及何时不能帮助您.

Linux应用程序通常仅使用换行符(\n)作为换行符.Windows应用程序使用回车符后跟换行符(\n\r)的组合.

如果您正在使用高级Java I/O例程 - 如果您正在浏览处理字符的读者和编写器,而不是低级Streams,尤其是字节流,那么库将转换为\n(其中,按照惯例,在内部使用作为其换行符)进入适合平台的表示.如果你正在使用较低级别的功能,你必须意识到这种区别并自己做正确的事.