Java在printf中的“%n”是怎么回事?


107

我正在阅读有效的Java,它%n在各处都用于换行符。我已经\n相当成功地在Java程序中使用了换行符。

哪个是“正确”的?这有什么错\n?Java为什么要更改此C约定?


1
只是一个猜测,但是:跨平台支持。不同的系统换行符使用不同的字符,例如\ n与\ r \ n。C#具有Environment.NewLine出于相同的目的。
乔丹跑步

Java在System中也有,但是%n在printf中更容易。
Paul Tomblin,2009年

Java为什么要更改此C约定== +1,:)
Michael Dimmitt

不变,增加/增强。\ n仍指\ n
比尔K

(致未来的读者注意:C已经\n以文本格式自动转换为平台特定的换行符,请参阅,Java则没有)
user202729

Answers:


150

从快速的Google:

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

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

原始资料


@ user2864740是的,它不会输出正确的平台特定的行分隔符,而是当前的分隔符。
Hauke Ingmar Schmidt 2014年

嗯,那是什么意思?
Kalpesh Soni,

我相信它为正在运行的当前操作系统使用一个操作系统,但是如果它在Linux上运行并为Windows输出代码,则可能不是您想要的。我不确定其他两个评论者可能在指什么。
比尔K


24

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

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


18

警告:

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


8

“正确”取决于您要尝试执行的操作。

\ n将始终为您提供“ unix样式”行结尾。\ r \ n将始终为您提供“ dos风格”行的结尾。%n将为您提供所运行平台的行尾

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

我可以看到为什么Java的设计人员不想复制C关于“文本”和“二进制”文件模式的怪异想法。


4

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

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


4

注意,只有在使用System.out.printf()System.out.format()Formatter对象时,这些答案才是正确的。如果您使用%nSystem.out.println(),它只会产生一个%n,而不是一个换行符。


0

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

始终建议在\ n上方使用此新版本的行分隔符。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.