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

我正在阅读有效的Java,它在任何地方都使用%n作为换行符。 我已经在Java程序中成功使用了新行。

哪一个是“正确”的? \n怎么了? 为什么Java改变这个C约定?

从快速谷歌:

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

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

原始来源

%n是跨平台的便携式\n不是。

请参阅参考文档中的格式化string语法 :

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

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

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

警告:如果你在使用NETWORKING代码,你可能更喜欢\ n的确定性,而不是%n,它可能在networking上发送不同的字符,取决于它在哪个平台上运行。

“正确”取决于你想要做什么。

\ n总是会给你一个“unix风格”的行结尾。 \ r \ n会一直给你一个“dos风格”的结局。 %n会给你所运行平台的结尾

C处理这个不同。 您可以select以“文本”或“二进制”模式打开文件。 如果以二进制模式打开文件\ n会给你一个“unix风格”的行结尾,“\ r \ n”会给你一个“dos风格”的行结尾。 如果您在dos / windows系统上以“文本”模式打开文件,那么当您编写\ n文件处理代码时,将其转换为\ r \ n。 所以通过在文本模式下打开一个文件并使用\ n,您将获得平台特定的行结束。

我可以看到为什么java的devise者不想复制C关于“文本”和“二进制”文件模式的黑客想法。

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

所以,当你确定你需要\u000A换行字符时,例如在networking中使用\n
在所有其他情况下,使用%n

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

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

总是build议在\ n上面使用这个新版本的行分隔符。