System.out 到底是什么?

What is System.out exactly?

我注意到从尚未由命令行启动的 JAR 文件(即用户双击启动的可运行 JAR 文件)对 System.out.println() 的任何调用都不会打开控制台.

经过一些研究,我在网站上找到了多个答案:

据我了解,System.out不代表控制台。它确实表示可以由需要显示它的任何东西处理的数据。 我说得对吗?

Systemfinal class 来自 java.lang 包(java 中的默认包)并且无法实例化。

outSystem class 的 static 成员字段,类型为 PrintStream,其访问说明符为 public final

println – 是 PrintStream class 的重载方法。 println 打印传递给标准控制台的参数和换行符。有多个 println 个具有不同参数的重载方法。每 println 调用 print 方法并添加一个换行符。在内部,打印调用 write()write() 负责将数据显示到标准输出 window.

这是它内部的样子:

//the System class belongs to java.lang package
class System {
  public static final PrintStream out;
  //...
}

//the Prinstream class belongs to java.io package
class PrintStream{
public void println();
//...
}

因此,我们不需要实例化 System 对象来将消息打印到屏幕;我们只需调用系统 class 的 public static PrintStream 成员 out 上的 println 方法。

但是你不能创建PrintStream的对象并调用println函数。当你想打印到标准输出时,你将使用System.out这是唯一的方法。实例化 PrintStream 将允许您写入指定的文件或 OutputStream,但与控制台没有任何关系。

但是,您可以将 System.out 传递给 PrintStream,然后在 PrintStream 对象上调用 println 以打印到标准输出。这是一个小例子:

import java.io.*;
public class SystemOutPrintlnDemo
{
  public static void main(String[] args) 
  {
    //creating PrintStream object
    PrintStream ps = new PrintStream(System.out);
    ps.println("Hello World!");
    ps.print("Hello World Again!");
    //Flushes the stream
    ps.flush();
  }
}

此处,System.out 代表输出流 - 您的输出将到达的位置。默认情况下,它设置为控制台。但您可以将其更改为其他类似文本文件。大多数情况下,在大型应用程序中,它用于日志记录(通常由新程序员使用,坏主意)。在这种情况下,您可以在相应的日志文件中看到输出。

现代操作系统(以及就此而言,一些较旧的操作系统)中的进程获得三个与之关联的标准 "streams":

  • 标准:基于流的输入 (stdin)
  • 标准输出:基于流的输出 (stdout)
  • 标准错误:基于流的错误输出(stderr)

它们统称为 standard streams

默认情况下,

System.inSystem.outSystem.err 是 Java 写入这些流的标准机制。

从命令行调用的程序 运行 在命令行中的击键转到 stdin 的环境中,stdoutstderr 的输出在控制台中显示为文本。它们可以被重定向到文件等。

通过 GUI 启动的程序通常不会将这些流挂接到您可以看到的任何内容。

我在上面说 "by default" 是因为您可以使用对 System 的调用来更改这些流指向的位置(它们具有创意名称,例如 setIn, setOut, and setErr。)

How do I open the console from a Runnable JAR file started by user with double-click?

那里存在错误的相关性:jar 是 运行nable 的事实并不是您看不到流的原因。如果你在命令行 运行 一个 运行nable jar,你会看到它的标准输出。

如果你 运行 它没有与某种控制台相关联,你是否可以看到该输出将取决于你如何 运行 安装它,并且可能,它是如何编写的.许多 GUI 框架会将标准输出和错误重定向到日志文件。或者该应用程序可能会提供调试选项。没有一个标准答案(没有双关语)。