Итак, из моего понимания, PrintStream должен использовать какой-то Java Native Interfacing для связи с операционной системой, чтобы он мог писать на стандартный вывод, или использует java какую-то другую технику? Я хотел бы знать, как меня интересуют архитектуры JVM. Мне очень интересно понять, как это работает, и архитектурой самой системы.В Java, как PrintStream заканчивает печать текста на консоль?
ответ
Стандартный выходной поток в OpenJDK является PrintStream
, который оборачивает BufferedOutputStream
, который оборачивает FileOutputStream
который created от FileDescriptor
. Существуют специальные объекты FileDescriptor
, которые соответствуют стандарту stdin, stdout и stderr (в частности, см. FileDescriptor.out
). Они имеют хорошо известные номера (например, stdout file descriptor - 1
). Таким образом, реальная логика находится внутри метода FileOutputStream.writeBytes
, который, естественно, является родным. На стороне Java мы выполняем буферизацию, синхронизацию и перевод символов в байты. Материал низкого уровня (запись байтов непосредственно в дескриптор файла) выполняется с помощью собственного кода.
Java System.out
PrintStream
пишет в stdout. Википедия описывает stdout as,
Дескриптор файла для стандартного вывода - 1 (один); определение POSIX
<unistd.h>
:STDOUT_FILENO
; соответствующая переменная<stdio.h>
равнаFILE* stdout
; Аналогично, переменная<iostream>
равнаstd::cout
.
В то время как Javadoc для System.out
говорит (частично)
"стандартный" выходной поток. Этот поток уже открыт и готов принять выходные данные.
Значит, он использует JNI, чтобы сделать это правильно? – TheRenegade
Не обязательно, он встроен в JVM ... так что это может быть собственный код (он может просто записываться в базовый поток C++), или он может писать в дескриптор файла. –
Хм странно спасибо! – TheRenegade
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 ... оттуда там становится туманно ... но в конце, YES, это будут JVM-конкретные реализации, которые обращаются к ОС через JNI. Извините, я не мог больше помочь. – JayC667
Все в порядке. Я искал ту же самую меру при поиске ответа, поэтому я пришел сюда, спасибо! – TheRenegade