为什么Java中的System.out.println()打印到控制台?

阿尼尔:

我在线阅读了几篇文章,解释了什么System.out.println()是Java。他们大多数都是这样的:

  • System包中finaljava.lang
  • outtype类public static内的一个对象SystemPrintStream
  • println() 将一行文本输出到输出流。

我的问题是,当我们System.out.println()在代码中进行操作时,为什么最终将其写入控制台?本文介绍了如何通过调用将文件写入文件System.setOut()所以我的问题转化为System.setOut()将其输出重定向到控制台的调用位置?

我检查System.setOut()来源它进行调用setOut0()是一种native方法。这种方法被直接调用内部initializeSystemClass()通过使其方法fdOut这是一种FileOutputStream定义在这里我没有找到传递到setOut0()任何地方的控制台输出流,也没有找到对在setOut()任何地方进行的非本地调用System开始执行时,JVM 是否在之外进行了其他操作如果是这样,有人可以指出我吗?

斯蒂芬·C:

我的疑问是,当我们System.out.println()在代码中进行操作时,为什么它最终会以书面形式写入控制台?

在任何POSIX兼容外壳程序中,在外壳程序启动时,每个进程都会获得三个“标准”流:

  • “标准输入”流用于读取输入。
  • “标准输出”流用于写入普通输出。
  • “标准错误”流用于写入错误输出。

(同样的想法也用于许多不符合POSIX的外壳中。)

对于交互式 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程序要做的事情”。


Shell如何在内部与jvm通信以在Windows和Linux中设置标准输入/输出?

这是在Linux,UNIX,Mac OSX和类似操作系统上发生的情况。(我不知道Windows。但是我想它是相似的。)

假设shell将要运行aaa > bbb.txt

  1. 父外壳“分叉”子进程...共享父外壳的地址空间。
  2. 子进程关闭文件描述符1(标准输出fd)
  3. 子进程打开“ bbb.tx”以写入文件描述符1。
  4. 子进程“ exec”是“ aaa”命令,它成为“ aaa”命令过程。传递文件描述符0、1和2。
  5. “ aaa”命令启动...

当“ aaa”命令启动时,它将发现文件描述符0和2(stdin和stderr)引用与父shell相同的“文件”。文件描述符1(stdout)引用“ bbb.txt”。

java命令“ aaa”时,会发生相同的情况

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么我的数组返回的方法无法打印到控制台?

如何在pytest中打印到控制台?

如何在Android Studio中打印到控制台?

什么是Java中System.out.println()中的system,out,println

如何停止Java库打印到控制台?

为什么这些goroutine无法打印到控制台?

System.out.print不会打印到控制台,否则会打印新行

为什么Gson会漂亮地打印到控制台,而不打印到文件?

为什么在以下代码中将320.04号打印到控制台?

在执行jar并将其输出重定向到文件时,在控制台上打印System.out.println语句

为什么在System.out.println()中不需要java.io.PrintStream?

System.out.println()不会打印到Eclipse中的控制台

为什么Spring Boot Batch应用程序无法打印到控制台?

为什么Mybatis Force将log4j DEBUG信息打印到控制台

JavaDStream将Lambda中的RDD打印到控制台

如何在SQL中打印到控制台?

JSP / Java / HTML | JSP out.println(); 在方法中打印到控制台

如何从Wordpress中的php文件打印到控制台

如何在Dart中水平打印到控制台?

为什么此常量无法打印到控制台?它只是空白

为什么不将此行打印到控制台?

PL / SQL无法打印到控制台(在SQLDeveloper中)

为什么Python在print()输出之前将异常打印到控制台

无法在Xcode中打印到控制台

在Java中将套接字消息打印到控制台

打印到SignalR Hub中的控制台

为什么这个并行过程不将输出写入文件,而是打印到控制台?

重新启动后,为什么我的守护进程无法打印到控制台?

在 Java 中将字符数组打印到控制台

TOP 榜单

热门标签

归档