2015-11-22 3 views
0

Итак, из моего понимания, PrintStream должен использовать какой-то Java Native Interfacing для связи с операционной системой, чтобы он мог писать на стандартный вывод, или использует 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 ... оттуда там становится туманно ... но в конце, YES, это будут JVM-конкретные реализации, которые обращаются к ОС через JNI. Извините, я не мог больше помочь. – JayC667

+0

Все в порядке. Я искал ту же самую меру при поиске ответа, поэтому я пришел сюда, спасибо! – TheRenegade

ответ

1

Стандартный выходной поток в OpenJDK является PrintStream, который оборачивает BufferedOutputStream, который оборачивает FileOutputStream который created от FileDescriptor. Существуют специальные объекты FileDescriptor, которые соответствуют стандарту stdin, stdout и stderr (в частности, см. FileDescriptor.out). Они имеют хорошо известные номера (например, stdout file descriptor - 1). Таким образом, реальная логика находится внутри метода FileOutputStream.writeBytes, который, естественно, является родным. На стороне Java мы выполняем буферизацию, синхронизацию и перевод символов в байты. Материал низкого уровня (запись байтов непосредственно в дескриптор файла) выполняется с помощью собственного кода.

0

Java System.outPrintStream пишет в stdout. Википедия описывает stdout as,

Дескриптор файла для стандартного вывода - 1 (один); определение POSIX <unistd.h>: STDOUT_FILENO; соответствующая переменная <stdio.h> равна FILE* stdout; Аналогично, переменная <iostream> равна std::cout.

В то время как Javadoc для System.out говорит (частично)

"стандартный" выходной поток. Этот поток уже открыт и готов принять выходные данные.

+0

Значит, он использует JNI, чтобы сделать это правильно? – TheRenegade

+0

Не обязательно, он встроен в JVM ... так что это может быть собственный код (он может просто записываться в базовый поток C++), или он может писать в дескриптор файла. –

+0

Хм странно спасибо! – TheRenegade

Смежные вопросы