console.writeline 和 System.out.println

新手上路,请多包涵

console.writelineSystem.out.println 之间的技术区别到底是什么?我知道 System.out.println 写入标准输出,但这与控制台不是一回事吗?

我不完全理解 console.writeline文档

原文由 ziggy 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 634
2 个回答

这是使用 System.out / .err .in System.console()

  • System.console() 如果您的应用程序未在终端中运行,则返回 null( 尽管您可以在您的应用程序中处理此问题
  • System.console() 提供不回显字符读取密码的方法
  • System.outSystem.err 使用默认平台编码,而 Console 类输出方法使用控制台编码

后一种行为可能不会立即显而易见,但像这样的代码可以证明差异:

 public class ConsoleDemo {
  public static void main(String[] args) {
    String[] data = { "\u250C\u2500\u2500\u2500\u2500\u2500\u2510",
        "\u2502Hello\u2502",
        "\u2514\u2500\u2500\u2500\u2500\u2500\u2518" };
    for (String s : data) {
      System.out.println(s);
    }
    for (String s : data) {
      System.console().writer().println(s);
    }
  }
}

在我的系统编码为 windows-1252 和默认控制台编码为 IBM850 的 Windows XP 上,这段代码将写成:

 ???????
?Hello?
???????
┌─────┐
│Hello│
└─────┘

请注意,此行为取决于控制台编码被设置为与系统编码不同的编码。由于一系列历史原因,这是 Windows 上的默认行为。

原文由 McDowell 发布,翻译遵循 CC BY-SA 2.5 许可协议

它们本质上是相同的,如果您的程序是从交互式提示符运行的并且您没有重定向标准输入或标准输出:

 public class ConsoleTest {
    public static void main(String[] args) {
        System.out.println("Console is: " + System.console());
    }
}

结果是:

 $ java ConsoleTest
Console is: java.io.Console@2747ee05
$ java ConsoleTest </dev/null
Console is: null
$ java ConsoleTest | cat
Console is: null

Console 存在的原因是提供在您从交互式命令行运行的特定情况下有用的功能:

  • 安全密码输入(难以跨平台)
  • 同步(多个线程可以提示输入并且 Console 会将它们很好地排队,而如果您使用 System.in/out 那么所有提示将同时出现)。

请注意,即使重定向 其中一个 流也会导致 System.console() 返回 null ;另一个令人恼火的是,当从另一个程序(如 Eclipse 或 Maven)生成时,通常没有可用的 Console 对象。

原文由 SimonJ 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题