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

我正在读《有效的 Java 》 ,它到处都用 %n表示换行符。在 Java 程序中,我已经成功地使用了 \n作为换行符。

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

116033 次浏览

通过简单的谷歌搜索:

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

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

原始来源

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

参见 格式化参考文档中的字符串语法:

N 行分隔符结果是 平台专用线路分离器

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

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

警告:

如果你正在做网络代码,你可能更喜欢确定性的 \n,而不是 %n,它可能会发送不同的字符通过网络,这取决于它运行在什么平台上。

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

N 总是给你一个“ unix 样式”的行结尾。 R n 总是给你一个“ dos 风格”的行结尾。 % n 将给出正在运行的平台的行结尾

C 的处理方式不同。您可以选择以“文本”或“二进制”模式打开文件。如果你以二进制模式打开文件,n 会给你一个“ unix 样式”的行结尾,而 r n 会给你一个“ dos 样式”的行结尾。如果你在 dos/windows 系统上以“文本”模式打开文件,那么当你写入文件处理代码时,它会转换成 r n。因此,通过以文本模式打开一个文件并使用 n,您可以得到平台特定的行结尾。

我可以理解为什么 java 的设计者不想复制 C 语言关于“文本”和“二进制”文件模式的粗糙想法。

在 java 中,\n总是生成 \u000A换行符。

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

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

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

总是推荐使用 n 以上的这个新版本的行分隔符。