Java中printf的"%n"是什么意思?

145
我正在阅读《Effective Java》,它在所有地方使用%n作为换行符号。我已经成功地在Java程序中使用\n作为换行符。哪个是“正确”的?\n有什么问题?为什么Java改变了这种C约定?

1
仅供猜测:跨平台支持。不同的系统使用不同的换行符,例如\n 和\r\n。C# 有 Environment.NewLine 来实现相同的目的。 - Jordan Running
Java中也有System的一些东西,但在printf中%n更容易。 - Paul Tomblin
1
为什么Java改变了这个C语言的约定== +1,:) - Michael Dimmitt
不是改变,而是添加/增强功能。\n 仍然表示换行。 - Bill K
2
(注:C语言会自动将\n转换为特定平台的换行符,Java则不会) - user202729
有人能提一下哪些Java版本支持这个吗? - Doc
8个回答

197

1
@user2864740 这是真的,它不会输出正确的特定于平台的行分隔符,而是当前的行分隔符。 - Hauke Ingmar Schmidt
1
嗯,那是什么意思? - Kalpesh Soni
2
我认为它使用当前操作系统的编译器,但如果它在Linux上运行并输出Windows代码,则可能不是您想要的。除此之外,我不确定其他两位评论者所指的是什么。 - Bill K
1
“correct platform-specific line separator”这个短语来自于Oracle文档本身,它是指“当前平台上字节码运行的正确分隔符”,因此2014年4月13日的原始评论只是混淆了。 - xdavidliu

41

1
请查看 https://docs.oracle.com/javase/1.5.0/docs/api/java/util/Formatter.html#dls。 - Namo

29

\n 是 Unix 系统中正确的换行符,但其他系统可能使用不同的字符来表示行末。特别是,Windows 系统中使用 \r\n,而早期的 MacOS 系统使用 \r

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


你可以使用System.lineSeparator()方法作为替代,而不是System.getProperty("line.separator") ;) - NikolaS

24

警告:

如果你正在进行网络编程,你可能更喜欢使用 \n 而不是 %n,因为在不同平台上运行时,%n 可能会发送不同的字符。


9
“正确”取决于您要做什么。 \n始终会给出“Unix风格”的换行符。 \r\n始终会给出“Dos风格”的换行符。 %n会给您运行平台的换行符。
C处理方式不同。您可以选择在“文本”或“二进制”模式下打开文件。如果您以二进制模式打开文件,则\n将为您提供“Unix风格”的换行符,而“\r\n”将为您提供“Dos风格”的换行符。如果您在dos/windows系统上以“文本”模式打开文件,则写入\n时,文件处理代码会将其转换为\r\n。因此,通过以文本模式打开文件并使用\n,您可以获得特定于平台的换行符。
我可以理解Java的设计者为什么不想复制C有关“文本”和“二进制”文件模式的hacky思想。

6

请注意,以下答案仅适用于使用System.out.printf()System.out.format()Formatter对象的情况。如果您在System.out.println()中使用%n,它将仅产生一个%n,而不是换行符。


4
在Java中,\n始终生成换行符\u000A。要获取特定平台的正确行分隔符,请使用%n。因此,在确保需要\u000A换行符的情况下(例如在网络编程中),请使用\n。在所有其他情况下请使用 %n

0

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

始终建议使用此新版本的行分隔符,即上面提到的 \n。


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