在printf中Java的"%n"有什么用?

rip*_*234 98 java printf newline

我正在阅读Effective Java,它%n用于所有地方的换行符.我\n在Java程序中使用了相当成功的换行符.

哪个'正确'?怎么了\n?为什么Java改变了这个C约定?

Bil*_*l K 137

从快速谷歌:

还有一个说明符与参数不对应.输出换行符的是"%n".在某些情况下也可以使用"\n",但由于"%n"始终输出正确的特定于平台的行分隔符,因此它可以跨平台移植,而"\n"则不是.

请参阅 https://docs.oracle.com/javase/tutorial/java/data/numberformat.html

原始来源

  • 根据使用的上下文,"正确的行分隔符"在很大程度上是任意的. (4认同)
  • 我相信它使用的是它正在运行的当前操作系统,但如果它在 Linux 上运行并为 Windows 输出代码,它可能不是您想要的。我不确定其他两位评论者可能指的是什么。 (2认同)

Gre*_*osz 27

%n是平台\n上的便携式 不是.

请参阅参考文档中格式化字符串语法:

'n'行分隔符结果是特定于平台的行分隔符


小智 24

虽然\n基于Unix的系统是正确的换行符,但其他系统可能使用不同的字符来表示行的结尾.特别是Windows系统使用\r\n,以及早期使用的MacOS系统\r.

通过%n在您的格式字符串中使用,您可以告诉Java使用返回的值System.getProperty("line.separator"),它是当前系统的行分隔符.


Geo*_*man 17

警告:如果您正在使用网络代码,您可能更喜欢\n的确定性,而不是%n可能会在网络上发送不同的字符,具体取决于它运行的平台.


小智 7

"正确"取决于你正在尝试做什么.

\n将始终为您提供"unix样式"行结尾.\ r \n将始终为您提供"dos style"行结尾.%n将为您提供正在运行的平台的行结尾

C以不同的方式处理.您可以选择以"文本"或"二进制"模式打开文件.如果以二进制模式打开文件\n将为您提供"unix样式"行结尾,"\ r \n"将为您提供"dos样式"行结尾.如果在dos/windows系统上以"文本"模式打开文件,则在编写文件处理代码时将其转换为\ r \n.因此,通过在文本模式下打开文件并使用\n,您可以获得特定于平台的行结束.

我可以看到为什么java的设计者不想复制C关于"文本"和"二进制"文件模式的hacky想法.


use*_*663 5

请注意,这些答案仅在使用System.out.printf()orSystem.out.format()Formatterobject时才成立。如果您使用%nin System.out.println(),它只会生成一个%n,而不是换行符。