因此,根据我的理解,PrintStream必须使用某种Java Native Interface与操作系统通信,这样它才能写入标准输出,还是Java使用了其他技术?我想知道JVM的体系结构吸引了我。了解它的工作方式和系统本身的体系结构对我来说非常有趣。
OpenJDK中的标准输出流是封装BufferedOutputStream
的PrintStream
,封装从FileDescriptor
创建的FileOutputStream
。有一些特殊的FileDescriptor
对象,它们对应于stdin、stdout和stderr(特别是,请参见FileDescriptor.out
)。它们具有众所周知的数字(例如,stdout文件描述符是1
)。所以真正的逻辑在FileOutputStream.writeBytes
方法内部,当然它是原生的。在Java方面,我们有缓冲、同步和将字符转换为字节。底层内容(直接向文件描述符写入字节)由本机代码完成。
System.out
PrintStream
写入stdout。维基百科将stdout描述为,
标准输出的文件描述符为1(一);POSIX
<unistd.h>
的定义是CCD_;对应的CCD_ 13变量为CCD_;类似地,<iostream>
变量是std::cout
。
而System.out
的Javadoc说(部分)
"标准"输出流。此流已打开,可以接受输出数据。