【问题标题】:What's up with Java's "%n" in printf?printf 中 Java 的“%n”是怎么回事?
【发布时间】:2010-12-25 09:31:07
【问题描述】:

我正在阅读 Effective Java,它使用%n 作为换行符无处不在。我在 Java 程序中使用 \n 相当成功。

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

【问题讨论】:

  • 只是猜测,但是:跨平台支持。不同的系统对换行使用不同的字符,例如\n 与 \r\n。 C# 有 Environment.NewLine 用于相同目的。
  • Java 在 System 中也有一些东西,但 %n 在 printf 中更容易。
  • 为什么 java 改变了这个 c 约定 == +1, :)
  • 不是更改,而是添加/增强。 \n 仍然意味着 \n
  • (未来读者请注意:C 已经将\n 自动转换为文本格式的平台特定换行符,参见this,Java 没有)

标签: java newline printf


【解决方案1】:

来自快速谷歌:

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

请参考 https://docs.oracle.com/javase/tutorial/java/data/numberformat.html

Original source

【讨论】:

  • @user2864740 没错,它不会输出 正确 平台特定的行分隔符,而是输出 current 行分隔符。
  • 嗯,这是什么意思?
  • 我相信它使用的是它正在运行的当前操作系统,但如果它在 Linux 上运行并为 Windows 输出代码,它可能不是你想要的。我不确定其他两位评论者可能指的是什么。
【解决方案2】:

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

formatting string syntax in the reference documentation

'n' 行分隔符 结果是 特定于平台的行分隔符

【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

    警告:

    如果您正在编写网络代码,您可能更喜欢\n 的确定性,而不是%n,后者可能会在网络上发送不同的字符,具体取决于它运行的平台。

    【讨论】:

      【解决方案5】:

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

      \n 总是会给你一个“unix 风格”的行尾。 \r\n 总是会给你一个“dos 风格”的行尾。 %n 将为您提供您正在运行的平台的行尾

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

      我明白为什么 java 的设计者不想复制 C 关于“文本”和“二进制”文件模式的骇人听闻的想法。

      【讨论】:

        【解决方案6】:

        请注意,这些答案仅在使用 System.out.printf()System.out.format()Formatter 对象时才成立。如果在System.out.println() 中使用%n,它只会生成%n,而不是换行符。

        【讨论】:

          【解决方案7】:

          在 java 中,\n 总是生成 \u000A 换行符。要获得特定平台的正确行分隔符,请使用%n

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

          【讨论】:

            【解决方案8】:

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

            始终建议在 \n 上方使用这个新版本的行分隔符。

            【讨论】:

              猜你喜欢
              • 2010-09-29
              • 2011-12-19
              • 1970-01-01
              • 2011-07-21
              • 1970-01-01
              • 1970-01-01
              • 2010-09-26
              • 2010-09-28
              • 1970-01-01
              相关资源
              最近更新 更多