我正在阅读Effective Java,它在任何地方使用%n
作为换行符。我在Java程序中使用\n
而非成功地使用了新行。
哪个'正确'? \n
有什么问题?为什么Java改变了这个C约定?
答案 0 :(得分:126)
快速谷歌:
还有一个说明符与参数不对应。输出换行符的是“%n”。在某些情况下也可以使用“\ n”,但由于“%n”始终输出正确的平台特定行分隔符,因此它可以跨平台移植,而“\ n”则不是。
请参考 https://docs.oracle.com/javase/tutorial/java/data/numberformat.html
答案 1 :(得分:26)
答案 2 :(得分:23)
虽然\n
是基于Unix的系统的正确换行符,但其他系统可能使用不同的字符来表示行的结尾。特别是,Windows系统使用\r\n
,早期的MacOS系统使用\r
。
在格式字符串中使用%n
,告诉Java使用System.getProperty("line.separator")
返回的值,这是当前系统的行分隔符。
答案 3 :(得分:15)
警告:如果您正在使用网络代码,您可能更喜欢\ n的确定性,而不是%n可能会在网络上发送不同的字符,具体取决于它运行的平台。
答案 4 :(得分:7)
"正确"取决于你正在尝试做什么。
\ n将始终为您提供" unix风格"行结束。 \ r \ n将永远给你一个" dos风格"行结束。 %n将为您提供正在运行的平台的行结尾
C处理方式不同。您可以选择在" text"中打开文件。或者"二进制"模式。如果你以二进制模式打开文件\ n将为你提供一个" unix风格"行结束和" \ r \ n"会给你一个" dos风格"行结束。如果您打开文件" text"在dos / windows系统上的模式然后当你写\ n文件处理代码将其转换为\ r \ n。因此,通过在文本模式下打开文件并使用\ n,您可以获得特定于平台的行结束。
我可以理解为什么java的设计师不想复制C"文本"和"二进制"文件模式。
答案 5 :(得分:4)
在java中,\n
始终生成\u000A
换行符。要为特定平台使用%n
获取正确的行分隔符。
因此,当您确定需要\n
换行符时,请使用\u000A
,例如在网络中。
在所有其他情况下,请使用%n
答案 6 :(得分:3)
请注意,这些答案仅在使用System.out.printf()
或System.out.format()
或Formatter
对象时才有效。如果您在%n
中使用System.out.println()
,则只会生成%n
,而不是换行符。
答案 7 :(得分:0)
%n格式说明符是可在操作系统之间移植的行分隔符。但是,它不能用作System.out.print或System.out.println函数的参数。
始终建议在\ n。
上方使用此新版本的行分隔符