在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上面使用这个新版本的行分隔符。