rip*_*234 98 java printf newline
我正在阅读Effective Java,它%n
用于所有地方的换行符.我\n
在Java程序中使用了相当成功的换行符.
哪个'正确'?怎么了\n
?为什么Java改变了这个C约定?
Bil*_*l K 137
从快速谷歌:
还有一个说明符与参数不对应.输出换行符的是"%n".在某些情况下也可以使用"\n",但由于"%n"始终输出正确的特定于平台的行分隔符,因此它可以跨平台移植,而"\n"则不是.
请参阅 https://docs.oracle.com/javase/tutorial/java/data/numberformat.html
小智 24
虽然\n
基于Unix的系统是正确的换行符,但其他系统可能使用不同的字符来表示行的结尾.特别是Windows系统使用\r\n
,以及早期使用的MacOS系统\r
.
通过%n
在您的格式字符串中使用,您可以告诉Java使用返回的值System.getProperty("line.separator")
,它是当前系统的行分隔符.
小智 7
"正确"取决于你正在尝试做什么.
\n将始终为您提供"unix样式"行结尾.\ r \n将始终为您提供"dos style"行结尾.%n将为您提供正在运行的平台的行结尾
C以不同的方式处理.您可以选择以"文本"或"二进制"模式打开文件.如果以二进制模式打开文件\n将为您提供"unix样式"行结尾,"\ r \n"将为您提供"dos样式"行结尾.如果在dos/windows系统上以"文本"模式打开文件,则在编写文件处理代码时将其转换为\ r \n.因此,通过在文本模式下打开文件并使用\n,您可以获得特定于平台的行结束.
我可以看到为什么java的设计者不想复制C关于"文本"和"二进制"文件模式的hacky想法.
请注意,这些答案仅在使用System.out.printf()
orSystem.out.format()
或Formatter
object时才成立。如果您使用%n
in System.out.println()
,它只会生成一个%n
,而不是换行符。