2016-11-16 9 views
1

Я просматриваю Java IO. Просто началось со стандартных потоков ввода и вывода. Пожалуйста, ознакомьтесь с простой программой, приведенной ниже,Я хотел бы знать, как работает System.err

public static void main(String args[]){ 
     Scanner scanner = new Scanner(System.in); 
     System.out.println("Give us your input"); 
     String str = scanner.nextLine(); 

     System.out.println("Standard Output: " + str); 
     System.err.println("Standard Error Output: " +str); 
    } 

Выход меняется во время работы два или три раза. Вы можете найти несколько ниже результатов,

Запуск в первый раз:

Дайте нам ваш вклад мое имя стандартный вывод ошибок: мое имя Standard Output: мое имя

Процесс закончил с выходом код 0

Запуск второй раз с тем же кодом: Дайте нам вход мое имя Стандартный вывод: мое имя Standard E rror Выход: мое Имя

Процесс закончил с кодом выхода 0

Я хотел бы знать, почему изменения выхода с System.err

ответ

1

System.out и System.err писать различные потоки, которые соединены с помощью различных труб в командную оболочку. Затем командная оболочка будет считывать данные из этих каналов и записывать данные в консольное приложение. Это в конечном итоге будет записываться на ваш экран.

Существует множество мест, где данные, записанные в один поток, могут «обгонять» данные, записанные на другой.

  • Возможно, это произошло в самом JVM, поскольку спецификации Java не дают никаких гарантий относительно того, какой поток будет написан первым. (На самом деле это маловероятно, если есть только один поток, выполняющий запись. С текущими реализациями Java поведение, вероятно, будет детерминированным ... хотя и не определено.)

  • Это может происходить в ОС, поскольку не являются гарантиями на порядок доставки данных, записанных на две независимые трубы.

  • Это может происходить в оболочке, поскольку ничто в спецификациях оболочки не указывает на приоритет чтения из труб.

Короче говоря, существует множество областей, где поведение неуточнено.

Следует также отметить, что наблюдаемое поведение может зависеть от версии используемой Java, ОС и ОС, вашего оборудования и нагрузки на вашу систему.

Наконец, возможно, вы ничего не могли сделать, чтобы гарантировать, что наблюдаемое перемежение (или нет) согласовано. Если вам нужна согласованность, напишите свой вывод только на один поток или другой.

3

Вашей программа будет написать первый System.out, а затем System.errprintln будет также промойте эти потоки), но нет никакой гарантии, в каком порядке/перемежении два потока появятся на вашей консоли.

Поскольку вы пишите им практически в одно и то же время, вы получите обе комбинации. Я полагаю, вы даже можете получить полулинейные интермедиации.

+0

Я запускал это несколько раз, и никакого перемежения не происходит. Не знаю, почему бы и нет. – mdewit

+0

@mdewit: Я не думаю, что вы на самом деле увидите чередование, если вы не отключите поток потока или не румянетесь в странных местах (и, возможно, даже не тогда). Но ты можешь *. В конце концов, до консоли, как и когда показывать эти данные. – Thilo

+0

Вы увидите перемежение, хотя если вы будете писать в один поток (например, 'System.out') из нескольких потоков одновременно. – Thilo

0

нет гарантии для того, чтобы System.out, System.in, System.err все может быть первым появился так порядок этих потоков не являются фиксированными