2015-11-22 32 views
0

因此,根據我的理解,PrintStream必須使用某種Java本地接口與操作系統進行通信,以便可以寫入標準輸出,或者java是否使用其他技術?我想知道JVM的體系結構讓我感興趣。我瞭解它的工作方式和系統本身的架構非常有趣。在Java中,PrintStream如何最終將文本打印到控制檯?

+0

grepcode.com通常是一個很好的運動,找出這樣的事情;但在這種情況下,我沒有得到滿意的結論: http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8u40-b25/sun/tools/jconsole/OutputViewer .java#46似乎指向System.setOut(PipeListener.create(「System.out」));它似乎是Unix管道監聽器......從那裏開始變得朦朧......但最後,是的,它將是通過JNI訪問操作系統的特定於JVM的實現。對不起,我忍不住了。 – JayC667

+0

這很好。我在尋找答案時遇到同樣的死亡,這就是我爲什麼來到這裏謝謝! – TheRenegade

回答

1

標準的輸出流是一個PrintStream它封裝BufferedOutputStream,它包裝FileOutputStream這從FileDescriptorcreated。有對應於stdin,stdout和stderr的特殊對象FileDescriptor(具體請參閱FileDescriptor.out)。他們有衆所周知的數字(例如,stdout file descriptor1)。所以真正的邏輯是在FileOutputStream.writeBytes這個方法當然是本地的。在Java方面,我們將字符緩衝,同步和轉換爲字節。低級別的東西(直接寫入文件描述符的字節)由本機代碼完成。

0

Java System.outPrintStream寫入stdout。 Wikipedia將stdout描述爲:

標準輸出的文件描述符爲1。 POSIX <unistd.h>的定義是STDOUT_FILENO;對應的<stdio.h>變量爲FILE* stdout;同樣,<iostream>變量是std::cout

雖然System.out的Javadoc說(部分)

「標準」 的輸出流。該流已經打開並準備好接受輸出數據。在OpenJDK的

+0

那麼它使用JNI來做到這一點是正確的? – TheRenegade

+0

不一定,它內置於JVM中......所以它可能是本地代碼(它可能只是寫入底層的C++流),或者可能寫入文件句柄。 –

+0

嗯奇怪的感謝! – TheRenegade

相關問題