2015-08-29 6 views
3

Я заметил, что любой вызов System.out.println() из файла JAR, который не был запущен командной строкой (т. Е. Запускаемый JAR-файл, запущенный пользователем с двойным щелчком), не откроет консоль.Что такое System.out?

После выполнения некоторых исследований, я нашел несколько ответов на сайте:

От КН я понимаю, System.out не представляет консоль. Он представляет собой данные, которые могут обрабатываться всем, что нужно отображать. Я прав?

  • Что такое System.out?
  • Как открыть консоль из запускаемого JAR-файла, запущенного пользователем с помощью двойного щелчка?

ответ

4

процессы в современных операционных системах (и в этом отношении, несколько более старых операционных систем) получают три стандартные «потоки», связанные с ними:

  • Стандарт в: входной поток на основе (stdin)
  • Стандартный из: поток на основе вывода (stdout)
  • Стандартная ошибка: поток на основе вывода ошибок (stderr)

Коллективно (и творчески) они называются standard streams.

System.in, System.out и System.err по умолчанию стандартный механизм Java для записи в эти потоки.

программы вызываются из командной строки выполняются в среде, где нажатие клавиш в командной строке перейдите к stdin, а выход обоих stdout и stderr показывает как текст в консоли. Они могут быть перенаправлены в файлы и т. Д.

Программы, запущенные через графические интерфейсы, часто не имеют этих потоков, подключенных ко всему, что вы можете видеть.

Я говорю «по умолчанию» выше, потому что вы можете использовать вызовы на System изменить, где те потоки точка (у них есть творческие имена, как setIn, setOut и setErr.)

How do I open the console from a Runnable JAR file started by user with double-click?

Там ложная корреляция существует : Тот факт, что банка работает, - это не то, почему вы не видите потоки. Если вы запустите runnable jar в командной строке, вы увидите его стандартный вывод.

Независимо от того, можете ли вы видеть этот вывод, если вы запустите его, не связавшись с какой-либо консолью, будет зависеть от того, как вы его используете и, возможно, как это написано. Многие интерфейсы графического интерфейса будут перенаправлять стандартную версию и ошибочно записывать в файл журнала. Или приложение может предлагать варианты отладки, которые это делают. Там нет ни одного стандартного ответа (без каламбура).

+0

Имеют ли программы, вызванные из командной строки, перенаправленные потоки, потому что сама консоль является приложением, которое запускает те, которые используют обычный API процессов Java, как и любой другой? –

+1

@FrancescoMenzani: Программы, вызванные из командной строки, обычно * не * перенаправляют потоки. Скажем, вы выполняете 'java -r runnable.jar': ОС запускает программу' java', предоставляя ей стандартные потоки.Программа java загружает банку и выполняет свою работу по настройке потоков для 'System' в недавно загруженной JVM для чтения и вывода на потоки, полученные из ОС. –

+0

Если у них нет перенаправленных потоков, тогда как консоль может обрабатывать свой IO? –

0

System является final класс от java.lang пакета (пакет по умолчанию в Java) и не может быть создан.

out является полем static члена System класса и типа PrintStream и его спецификаторы доступа являются public final.

println - это перегруженный метод класса PrintStream. println печатает аргумент, переданный стандартной консоли и новой строке. Существует несколько перегруженных методов println с разными аргументами. Каждый println выполняет вызов метода печати и добавляет новую строку. Внутренние вызовы печати write() и write() заботятся о отображении данных в стандартное окно вывода.

Здесь, как это должно выглядеть в внутри:

//the System class belongs to java.lang package 
class System { 
    public static final PrintStream out; 
    //... 
} 

//the Prinstream class belongs to java.io package 
class PrintStream{ 
public void println(); 
//... 
} 

Поэтому мы не должны когда-либо экземпляр System объекта для печати сообщений на экране; мы просто вызываем метод println на члене public static PrintStream класса System, out.

Но вы не можете создать объект PrintStream и вызвать функцию println. Если вы хотите печатать на стандартный вывод, вы будете использовать System.out. Это единственный способ:. Создание экземпляра PrintStream позволит вам записать указанный вами файл или OutputStream, но не имеет ничего общего с консолью.

Однако вы можете передать System.out в PrintStream, а затем вызвать println на PrintStream объект для печати на стандартный выход.Вот небольшой пример:

import java.io.*; 
public class SystemOutPrintlnDemo 
{ 
    public static void main(String[] args) 
    { 
    //creating PrintStream object 
    PrintStream ps = new PrintStream(System.out); 
    ps.println("Hello World!"); 
    ps.print("Hello World Again!"); 
    //Flushes the stream 
    ps.flush(); 
    } 
} 
+0

Хотя это может быть правильно, мой вопрос касается не синтаксиса. Я хочу знать, какой класс и мир позади. –

+0

Проверьте мой обновленный ответ, я надеюсь, что он решает ваши сомнения в отношении особенностей. Я предлагаю вам продолжить [эту ссылку] (http://docs.oracle.com/javase/7/docs/api/java/lang/System.html) для получения дополнительных ответов в классе 'System'. –

+0

Возможно, я должен был сказать «цель» вместо «функции». Я не хочу знать, как разработчики Oracle внедрили класс 'System', но как работают эти потоки. –

3

Здесь System.out представляет собой выходной поток - где ваш выход будет. По умолчанию он настроен на консоль. Но вы можете изменить его на другой текстовый файл. Чаще всего в большом приложении он используется для ведения журнала (обычно новым программистом, плохая идея). В этом случае вы можете увидеть результат в соответствующем файле журнала.