2010-10-06 4 views
3

Есть System.out, stdout и cout ТОЧНО то же самое в Java, C и C++ соответственно?Есть System.out, stdout и cout то же самое?

Почему существуют три разных имени для одного и того же (особенно, когда C, C++ и Java имеют много общего)?

Кроме того, я знаю, для чего они используются, но что это такое, под капотом, я имею в виду?

+2

C, C++ и Java синтаксически похожи, но имеют разную семантику. – Philipp

+0

Ну, это разные компьютерные языки. –

+0

Ни один из них не является частью языка. Это часть библиотек, которые поставляются с языком. Они не являются ключевыми словами, а не частью спецификации языка. –

ответ

4

cout является по существу такой же, как stdout но разница в том, что cout имеет тип ostream (который по существу означает, что можно вводить данные в формате с помощью << или неформатированные данных с помощью метода write.

stdout прикреплен к дескриптор файла (стандартный вывод является FILE*). stdout дескриптор файла 1. Поскольку он возвращает ссылку на файловый дескриптор, он может быть использован в fputs и fprintf.

Java System.out по существу похож на stdout (он использует java.io.FileDescriptor с ручкой 1) и передан в FileOutputStream и, наконец, обернут внутри BufferedOutputStream.

Это как java.lang.System инициализируется:

/** 
    * Initialize the system class. Called after thread initialization. 
    */ 
    private static void initializeSystemClass() { 
    props = new Properties(); 
    initProperties(props); 
    sun.misc.Version.init(); 

     // Workaround until DownloadManager initialization is revisited. 
     // Make JavaLangAccess available early enough for internal 
     // Shutdown hooks to be registered 
     setJavaLangAccess(); 

     // Gets and removes system properties that configure the Integer 
     // cache used to support the object identity semantics of autoboxing. 
     // At this time, the size of the cache may be controlled by the 
     // vm option -XX:AutoBoxCacheMax=<size>. 
     Integer.getAndRemoveCacheProperties(); 

    // Load the zip library now in order to keep java.util.zip.ZipFile 
    // from trying to use itself to load this library later. 
    loadLibrary("zip"); 

    FileInputStream fdIn = new FileInputStream(FileDescriptor.in); 
    FileOutputStream fdOut = new FileOutputStream(FileDescriptor.out); 
    FileOutputStream fdErr = new FileOutputStream(FileDescriptor.err); 
    setIn0(new BufferedInputStream(fdIn)); 
    setOut0(new PrintStream(new BufferedOutputStream(fdOut, 128), true)); 
    setErr0(new PrintStream(new BufferedOutputStream(fdErr, 128), true)); 

    // Setup Java signal handlers for HUP, TERM, and INT (where available). 
     Terminator.setup(); 

     // Initialize any miscellenous operating system settings that need to be 
     // set for the class libraries. Currently this is no-op everywhere except 
     // for Windows where the process-wide error mode is set before the java.io 
     // classes are used. 
     sun.misc.VM.initializeOSEnvironment(); 

    // Set the maximum amount of direct memory. This value is controlled 
    // by the vm option -XX:MaxDirectMemorySize=<size>. This method acts 
    // as an initializer only if it is called before sun.misc.VM.booted(). 
    sun.misc.VM.maxDirectMemory(); 

    // Set a boolean to determine whether ClassLoader.loadClass accepts 
    // array syntax. This value is controlled by the system property 
    // "sun.lang.ClassLoader.allowArraySyntax". This method acts as 
    // an initializer only if it is called before sun.misc.VM.booted(). 
    sun.misc.VM.allowArraySyntax(); 

    // Subsystems that are invoked during initialization can invoke 
    // sun.misc.VM.isBooted() in order to avoid doing things that should 
    // wait until the application class loader has been set up. 
    sun.misc.VM.booted(); 

     // The main thread is not added to its thread group in the same 
     // way as other threads; we must do it ourselves here. 
     Thread current = Thread.currentThread(); 
     current.getThreadGroup().add(current); 
    } 

FileDescriptor.out является:

/** 
* A handle to the standard output stream. Usually, this file 
* descriptor is not used directly, but rather via the output stream 
* known as <code>System.out</code>. 
* @see  java.lang.System#out 
*/ 
public static final FileDescriptor out = standardStream(1); 

Источник:

+1

«Дескриптор файла» не является частью языка C, а скорее POSIX. Выражение «stdout» возвращает дескриптор файла «неверное использование языка (как может переменная« возвращать »что-нибудь?) И вводит в заблуждение. –

+0

@R. Спасибо, обновлено ... –

4

Это то же самое, но они не имеют того же типа. Например, stdout является FILE* и cout является std::ostream. Поскольку C++ поддерживает оба, необходимы разные имена.

Под капотом все эти переменные ссылаются на стандартный вывод вызывающего процесса. Это один из трех файловых дескрипторов (stdin, stdout, stderr), которые всегда открываются ОС, когда он запускает новый процесс. Все, записанное в этот файловый дескриптор, заканчивается на экране или там, где stdout был перенаправлен (используя операторы оболочки > или >>).

0

В теории они одно и то же, все они направлены на стандартный вывод.

Но в C и C++ cout строит поверх stdout, чтобы добавить некоторые функции, которые System.out предоставляет как форматирование. Поскольку у java нет понятия указателей, System, out был изменен, чтобы использовать PrintStream для выполнения подобной задачи как cout.

PritnStream предоставляет некоторые дополнительные функции, например, PrintStream не генерирует исключение IOException, а вместо этого устанавливает внутренний флаг ошибки, к которому можно получить доступ, используя checkError.

Я думаю, что соглашения об именах соблюдались, потому что дизайнеры каждого языка были разными. C, C++ тесно связан с Unix, и поэтому они использовали термины, такие как стандартный вывод и консоль, и т. Д. Java была спроектирована так, чтобы быть более объектно-ориентированной, и, таким образом, создатель Java решил назвать ее несколько иначе.

0

Это все языковые способы записи в файл стандартного вывода программы, концепция, которая возникла с помощью C/UNIX. Они отличаются точными функциями/методами, которые они обеспечивают для выполнения вывода.

Стоит также отметить, что оба cout и stdout доступны в C++, так как он на полпути пытается быть подмножеством языка C, но смешивание использование двух может быть плохой идеей, если не отключить буферизацию полностью на обоих , Я не знаю никаких требований к тому, чтобы эти два разделили буфер, так что возможно, что выход будет нарушен, если вы их смешаете.

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