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

时间:2009-12-10 19:24:22

标签: java newline printf

我正在阅读Effective Java,它在任何地方使用%n作为换行符。我在Java程序中使用\n而非成功地使用了新行。

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

8 个答案:

答案 0 :(得分:126)

快速谷歌:

  

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

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

Original source

答案 1 :(得分:26)

%n可跨平台移植 \n不是。

请参阅formatting string syntax in the reference documentation

  

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

答案 2 :(得分:23)

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

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

答案 3 :(得分:15)

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

答案 4 :(得分:7)

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

\ n将始终为您提供" unix风格"行结束。 \ r \ n将永远给你一个" dos风格"行结束。 %n将为您提供正在运行的平台的行结尾

C处理方式不同。您可以选择在" text"中打开文件。或者"二进制"模式。如果你以二进制模式打开文件\ n将为你提供一个" unix风格"行结束和" \ r \ n"会给你一个" dos风格"行结束。如果您打开文件" text"在dos / windows系统上的模式然后当你写\ n文件处理代码将其转换为\ r \ n。因此,通过在文本模式下打开文件并使用\ n,您可以获得特定于平台的行结束。

我可以理解为什么java的设计师不想复制C"文本"和"二进制"文件模式。

答案 5 :(得分:4)

在java中,\n始终生成\u000A换行符。要为特定平台使用%n获取正确的行分隔符。

因此,当您确定需要\n换行符时,请使用\u000A,例如在网络中。
在所有其他情况下,请使用%n

答案 6 :(得分:3)

请注意,这些答案仅在使用System.out.printf()System.out.format()Formatter对象时才有效。如果您在%n中使用System.out.println(),则只会生成%n,而不是换行符。

答案 7 :(得分:0)

%n格式说明符是可在操作系统之间移植的行分隔符。但是,它不能用作System.out.print或System.out.println函数的参数。

始终建议在\ n。

上方使用此新版本的行分隔符