因此,根據我的理解,PrintStream必須使用某種Java本地接口與操作系統進行通信,以便可以寫入標準輸出,或者java是否使用其他技術?我想知道JVM的體系結構讓我感興趣。我瞭解它的工作方式和系統本身的架構非常有趣。在Java中,PrintStream如何最終將文本打印到控制檯?
回答
標準的輸出流是一個PrintStream
它封裝BufferedOutputStream
,它包裝FileOutputStream
這從FileDescriptor
created。有對應於stdin,stdout和stderr的特殊對象FileDescriptor
(具體請參閱FileDescriptor.out
)。他們有衆所周知的數字(例如,stdout file descriptor是1
)。所以真正的邏輯是在FileOutputStream.writeBytes
這個方法當然是本地的。在Java方面,我們將字符緩衝,同步和轉換爲字節。低級別的東西(直接寫入文件描述符的字節)由本機代碼完成。
Java System.out
PrintStream
寫入stdout。 Wikipedia將stdout描述爲:
標準輸出的文件描述符爲1。 POSIX
<unistd.h>
的定義是STDOUT_FILENO
;對應的<stdio.h>
變量爲FILE* stdout
;同樣,<iostream>
變量是std::cout
。
雖然System.out
的Javadoc說(部分)
「標準」 的輸出流。該流已經打開並準備好接受輸出數據。在OpenJDK的
那麼它使用JNI來做到這一點是正確的? – TheRenegade
不一定,它內置於JVM中......所以它可能是本地代碼(它可能只是寫入底層的C++流),或者可能寫入文件句柄。 –
嗯奇怪的感謝! – TheRenegade
- 1. 將控制檯窗口打印到文本文件中,java
- 2. 將文本打印到控制檯的最佳技術
- 3. 如何在系統調用中打印到控制檯(終端)
- 4. 如何讀取文本文件並將其打印到控制檯窗口? Java
- 5. 如何使用phantomjs將控制檯打印到控制檯
- 6. 如何在控制檯中打印和在文本文件中打印
- 7. 如何禁止在.NET中將控件打印到控制檯?
- 8. 如何控制通過fmt將文本打印到控制檯的位置?
- 9. 如何將文字信息打印到控制檯中
- 10. 如何將數據從數據庫打印到Java控制檯?
- 11. 無法將非英文文本打印到控制檯窗口
- 12. Java打印到Dragon控制檯
- 13. Java Eclipse不會打印到控制檯
- 14. NetBeans不會打印到控制檯JAVA
- 15. 如何在斷點上將控件打印到控制檯上?
- 16. 如何在記事本文件中打印控制檯輸出?
- 17. 在控制檯中打印時,如何將打印出來的文字移動到文本的外面
- 18. 如何讓JavaScript來打印文本輸入到控制檯
- 19. 如何從控制檯中的文本文件打印值?
- 20. 如何用Dart打印到控制檯?
- 21. 如何從XSJS打印到控制檯
- 22. Python 3:如何將輸出打印到控制檯和文件
- 23. 在C++中打印彩色文本到控制檯
- 24. 如何在打印到控制檯時在R中的列中包裝文本?
- 25. Hamcrest - 打印到控制檯
- 26. 在PyDev中打印到控制檯
- 27. 在SignalR Hub中打印到控制檯
- 28. 將ULARGE_INTEGER打印到控制檯
- 29. 將char32_t打印到控制檯
- 30. 在文本控制檯中打印文本
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
這很好。我在尋找答案時遇到同樣的死亡,這就是我爲什麼來到這裏謝謝! – TheRenegade