什么';它支持Java';s";%";在printf中?
我正在阅读有效的Java,它使用什么';它支持Java';s";%";在printf中?,java,newline,printf,Java,Newline,Printf,我正在阅读有效的Java,它使用%n作为换行符。我在Java程序中相当成功地将\n用于换行符 哪个是正确的?\n有什么问题吗?为什么Java改变了这个C约定?从一个快速的google: 还有一个说明符与参数不对应。输出换行符的是“%n”。在某些情况下也可以使用“\n”,但由于“%n”始终输出正确的平台特定行分隔符,因此它可以跨平台移植,而“\n”则不能 请参阅 %n可跨平台移植 \n不是 见: “n”行分隔符结果为 平台专用线分离器 对于基于Unix的系统,\n是正确的换行符,但其他系统可能会
%n
作为换行符。我在Java程序中相当成功地将\n
用于换行符
哪个是正确的?\n
有什么问题吗?为什么Java改变了这个C约定?从一个快速的google:
还有一个说明符与参数不对应。输出换行符的是“%n”。在某些情况下也可以使用“\n”,但由于“%n”始终输出正确的平台特定行分隔符,因此它可以跨平台移植,而“\n”则不能
请参阅
%n
可跨平台移植
\n
不是
见:
“n”行分隔符结果为
平台专用线分离器
对于基于Unix的系统,
\n
是正确的换行符,但其他系统可能会使用不同的字符来表示行尾。特别是,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系统上以“文本”模式打开文件,则在写入文件时,\n文件处理代码会将其转换为\r\n。因此,通过以文本模式打开文件并使用\n,可以获得平台特定的行结尾
我明白为什么java的设计者不想复制C关于“文本”和“二进制”文件模式的拙劣想法。在java中,
\n
总是生成\u000A
换行符。要为特定平台获取正确的行分隔符,请使用%n
因此,如果您确定需要\u000A
换行符,请使用\n
,例如在网络中在所有其他情况下,请使用
%n
注意,只有在使用System.out.printf()
或System.out.format()
或格式化程序
对象时,这些答案才是正确的。如果在System.out.println()
中使用%n
,它只会生成一个%n
,而不是换行符。%n格式说明符是一个跨操作系统可移植的行分隔符。但是,它不能用作System.out.print或System.out.println函数的参数
始终建议使用上述新版本的行分隔符。\n.只是猜测,但是:跨平台支持。不同的系统使用不同的换行符,例如。\n vs。\r\n。C#有Environment.NewLine用于同样的目的。Java在系统中也有一些东西,但在printf中%n更容易。为什么Java要更改此C约定==+1,:)不是更改,而是添加/增强\n仍然意味着\n(未来读者注意:C已经自动将
\n
转换为特定于平台的文本格式换行符,请看,Java没有)@user2864740是的,它没有输出正确的特定于平台的行分隔符,但输出的是当前的行分隔符。嗯,这意味着什么?我相信它使用的是当前运行的操作系统的行分隔符,但是,如果它运行在Linux上并输出windows代码,那么它可能不是您想要的。我不确定其他两位评论者可能指的是什么。参见