Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Принципиальные различия в консольных выводах?


Автор: BlHol 8.8.2007, 13:06
День добрый!

Очень часто встречаю в различных примерах  вывод на консоль как System.out.println(), так и System.err.println(). И в том и в другом случаях - вывод на консоль аргумента println(). Вопросы в следующем: 
1. в чем разница? 
2. Чем руководствоваться при выборе .err. или .out.?

Два примера:
1.
Код

     try
     {
      File dir = new File(dirName);

        if (!dir.exists())
             dir.mkdir();
             
           else
               if (!dir.isDirectory())
               {
                 System.err.println(dirName + " is not directory");
                 return;
               }





2.

Код

        try
        {
            
          String dirName = new String("F:\\my_project\\");
          String fileName = new String("char_files.txt");

          File output = new File(dirName,fileName);

          output.createNewFile();

          if (!output.isFile())
          {
          System.out.println("Creating " + output.getPath() + " failed ");
           return;        
          }

        }
        catch (IOException e)
        {
          System.out.println("Error writing the file " + e);

        }


Вот, ломаю голову чем обусловлено использование System.err.println() в первом случае и
 System.out.println() во втором?


Заранее спасибо.
С уважением.

Автор: AntonSaburov 8.8.2007, 13:44
Исторически сложилось, что существует три основных потока - "ввод", "вывод", "ошибки". in, out, err

Часто "ошибки" совмещают с выводом - ибо нормально сие. Но всегда можно изменить стандартный вывод на другой - в тот же файл или еще куда. Можно посмотреть класс System - там как раз это есть.

Автор: Metal_Heart 8.8.2007, 13:54
Цитата(AntonSaburov @  8.8.2007,  13:44 Найти цитируемый пост)
Часто "ошибки" совмещают с выводом

это верно только для виндов, линуксоиды чаще всего эти потоки разделяют!

Автор: BlHol 8.8.2007, 14:13
Тогда, какая разница что использовать?

Автор: AntonSaburov 8.8.2007, 14:41
Цитата(BlHol @  8.8.2007,  14:13 Найти цитируемый пост)
Тогда, какая разница что использовать?

Разница в идеологии - есть три основных потока при запуске программы, которые есть. И ими можно управлять, если очень хочется. Ибо выводить ошибки на экран не всегда хорошо, но скидывать их в лог хотелось бы. Ну и т.д.

Автор: BlHol 8.8.2007, 15:06
Извиняюсь, еще немножко помучаю?
1. Если в log, то err переопределять нужно. Так?
2. Если .out.println()  и .err.println()  выводят результат на консоль, то какая разница между ними в данном конкретном случае?

Заранее спасибо.

Автор: alex_smirnov 8.8.2007, 15:23
Не знаю как в Винде, но в Линухе разделение потоков, выдающихся на консоль будет выглядеть так:

java blablabla.class > x
стандартный поток вывода перенаправляется в файл;

java blablabla.class >& x
поток err перенаправляется в файл x;

и, если я не ошибаюсь:

(java blablabla.class > std) >& err
разделит два потока в два файла одновременно;

интересно, а как в Форточках разделять эти потоки?

Автор: AntonSaburov 8.8.2007, 15:26
Цитата(BlHol @  8.8.2007,  15:06 Найти цитируемый пост)
1. Если в log, то err переопределять нужно. Так?

Да
Цитата(BlHol @  8.8.2007,  15:06 Найти цитируемый пост)
2. Если .out.println()  и .err.println()  выводят результат на консоль, то какая разница между ними в данном конкретном случае?

Никакой.

Цитата(alex_smirnov @  8.8.2007,  15:23 Найти цитируемый пост)

интересно, а как в Форточках разделять эти потоки?

Так же практически

Автор: anglerhood 8.8.2007, 15:36
из http://java.sun.com/javase/6/docs/api/ :
Цитата

Typically this stream corresponds to display output or another 
output destination specified by the host environment or user.
By convention, this output stream is used to display error messages or other information that should come to the immediate attention of a user even if the principal output stream, the value of the variable out, has been redirected to a file or other destination that is typically not continuously monitored.


А если по-русски, то в err отправляются сообщения, которые требую немедленного внимания юзера, даже если  стандартный out направлен в файл или в другое место, которое постоянно не отслеживается юзером.

Автор: COVD 8.8.2007, 16:04
Цитата

2. Если .out.println()  и .err.println()  выводят результат на консоль, то какая разница между ними в данном конкретном случае?


если программа отлаживается в IDE, то удобство в том, что разным цветом выводится - например, err - красным, а out - черным.

Автор: BlHol 8.8.2007, 16:22
Спасибо за разъяснения!

Автор: Metal_Heart 8.8.2007, 16:35
anglerhood, почти сказал следующее:
поток ERR - не буфферизируется, потому данные на его выход поступают сразу же;
поток OUT - буфферизируется, потому данные на его выход могут поступать с задержкой;

грубый пример о буфферизации:
изучал JNI  под Линухом, тестовый пример предполагал о каждом действии выплевывать инфу на консоль. Так вот когда я впервые увидел свой лог в консоли я сначала был удивлен:
сначала вывелось всё, что java-приложение делало:
 - открыл файл;
 - запись данных в файл;
 - закрыл файл.

, затем вывелось всё, что драйвер делал, хотя они работали "бок-о-бок":
 - получен указатель на файл;
 - записывается такой-то блок данных в файл;
 - указатель освобожден.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)