我在网上阅读了几篇文章,解释了 System.out.println()
是在 Java 中。他们中的大多数都是这样的:
System
is afinal
class in thejava.lang
package.out
is apublic static
object inside theSystem
class of typePrintStream
.println()
prints a line of text to the output stream.
我的问题是我们什么时候做
System.out.println()
在我们的代码中,为什么它最终会写入控制台? This article解释了如何通过调用 System.setOut()
将其写入文件.所以我的问题转化为 System.setOut()
在哪里调用将其输出重定向到控制台?我查了
System.setOut()
的source .它调用setOut0()
这是一个 native
方法。这个方法是directly called里面initializeSystemClass()
通过传递方法fdOut
这是一个 FileOutputStream
定义 here .我没有找到传递给 setOut0()
的控制台输出流在任何地方,我也没有找到非本地人的电话 setOut()
在任何地方完成。是在 System
之外的其他地方完成的吗?在开始执行时由 JVM 类?如果是这样,有人可以指出我吗?
最佳答案
My doubt is when we do
System.out.println()
in our code, why it ends up in writing to console?
在任何符合 POSIX 的 shell 中,每个进程在 shell 启动时都会获得三个“标准”流:
(同样的想法也用于许多非 POSIX 兼容的 shell。)
对于交互式 POSIX shell,默认设置是让这些流从 shell 的“控制台”读取和写入……这可能是一个物理控制台,但更有可能是用户(最终)上的“终端模拟器”台式机。 (细节有所不同。)
POSIX shell 允许您以各种方式重定向标准流;例如
$ some-command < file # read stdin from 'file'
$ some-command > file # write stdout to 'file'
$ some-command 2> file # write stderr to 'file'
$ some-command << EOF # read stdin from a 'here' document
lines of input
...
EOF
$ some-command | another # connect stdout for one command to
# stdin for the next one in a pipeline
等等。如果您这样做,一个或多个标准流不会连接到控制台。进一步阅读:
那么这与问题有什么关系呢?
当 Java 程序启动时,
System.in/out/err
流连接到父进程指定的标准输入/输出/错误流;通常是一个外壳。在
System.out
的情况下,这可能是控制台(无论您如何定义),也可能是一个文件、另一个程序或... /dev/null
.但是输出的去向取决于 JVM 的启动方式。因此,字面上的答案是“因为这是父进程告诉 Java 程序要做的事情”。
How internally shell communicates with jvm to set standard input / output in both Windows and Linux?
这就是 Linux、UNIX、Mac OSX 和类似设备会发生的情况。 (我不知道 Windows ......但我想它是相似的。)
假设 shell 将运行
aaa > bbb.txt
.当“aaa”命令启动时,它发现文件描述符 0 和 2(stdin 和 stderr)引用了与父 shell 相同的"file"。文件描述符 1 (stdout) 是指“bbb.txt”。
当“aaa”是
java
时,也会发生同样的事情。命令。
关于java - 为什么 Java 中的 System.out.println() 会打印到控制台?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61168525/