在 Java 中,PrintStream 如何最终将文本打印到控制台?

In Java, how does PrintStream end up printing text to the console?

所以根据我的理解,PrintStream 必须使用某种 Java 本机接口与操作系统通信,以便它可以写入标准输出,或者 java 使用其他一些技术?我想知道 JVM 的体系结构让我感兴趣。了解它的工作方式和系统本身的架构对我来说非常有趣。

Java System.out PrintStream writes to stdout。维基百科将标准输出描述为,

The file descriptor for standard output is 1 (one); the POSIX <unistd.h> definition is STDOUT_FILENO; the corresponding <stdio.h> variable is FILE* stdout; similarly, the <iostream> variable is std::cout.

JavaSystem.out 的文档说(部分)

The "standard" output stream. This stream is already open and ready to accept output data.

OpenJDK 中的标准输出流是 PrintStream 包装 BufferedOutputStream,包装 FileOutputStreamcreated from FileDescriptor. There are special FileDescriptor objects which correspond to the stdin, stdout and stderr (in particular, see FileDescriptor.out). They have well known numbers (for example, stdout file descriptor1)。所以真正的逻辑在 FileOutputStream.writeBytes 方法里面,当然是原生的。在 Java 端,我们有缓冲、同步和字符到字节的转换。低级别的东西(直接将字节写入文件描述符)由本机代码完成。