Слушатель для предотвращения отображения System.out на экране - PullRequest
4 голосов
/ 04 мая 2010

Я занимался своим академическим проектом, и при сборке и тестировании я поместил много операторов println ().

Но когда я должен был отправить все отпечатки не должны отображаться.

Могу ли я реализовать что-то вроде слушателя, который будет вызываться при попытке запуска System.out и препятствовать его отображению. Я не знаю, насколько осуществима эта идея, но просто хочу знать, возможна ли она или нет. Я знаю, что мог бы использовать файл журнала или записать в файл, но мне снова пришла в голову мысль, если мне нужно отключить SOP, как я могу это сделать ...

спасибо

Ответы [ 5 ]

9 голосов
/ 04 мая 2010

использовать функцию System.setOut (и setErr) Следующая программа напечатает только 1: (а не 2)

public static void main(String[] args) throws FileNotFoundException {
    System.out.println("1");
    System.setOut(new PrintStream(new OutputStream() {
        @Override
        public void write(int arg0) throws IOException {
            // TODO Auto-generated method stub

        }
    }));
    System.out.println("2");
}
7 голосов
/ 04 мая 2010

Правильнее всего использовать флаги перед printlns или, что еще лучше, использовать Logger (доступно много версий).

Однако возможно перенаправить весь System.out. Ищите «redirect system.out», и вы найдете множество примеров.

1 голос
/ 04 мая 2010

Как правило, не стоит писать жесткий код в System.out. В качестве быстрого решения вы можете изменить все ссылки на System.out на вашу собственную статическую переменную в одном из ваших классов. Это, по крайней мере, дает вам возможность изменить поток, в который вы пишете. Э.Г.

public static void main(String[] args)
{
    static public PringStream out = System.out;

    void someMethod()
    {
       out.println("some logging message");
    }
}

Вы можете быстро заменить все виды использования System.out в своем коде на Myclass.out. После этого вы можете изменить поток вывода в соответствии с аргументами или системными свойствами. Э.Г.

if (Boolean.getBoolean("debug"))
   out = System.out;
else
   out = new PrintStream(new OutputStream() {
    public void write(int data) throws IOException {}
   };

Конечно, это все штучки и одноразовый код.

Более надежное и гибкое решение - использовать API для регистрации, например slf4j .

1 голос
/ 04 мая 2010

Использовать log4j. Это позволит вам сделать что-то вроде:

if (log.isLoggingEnabled()) {
   log.debug("this will be printed at runtime with debugging enabled");
}

Затем вы можете настроить приложение так, чтобы оно не печатало операторы отладки после отправки кода (это обычно делается в файле .properties или в файле XML). Использование регистратора является очень распространенной практикой на сайтах, работающих на Java, и, в частности, есть немало документации по log4j. Фактически, отправка кода со строками System.out для отладки считается плохой формой в большинстве кругов. Подумайте о человеке, читающем файлы журнала!

Существует крошечный удар по производительности при дополнительном вызове метода с использованием регистратора, но это сделает обслуживание более практичным. Вы, наверное, тоже поразите своего инструктора:)

0 голосов
/ 04 мая 2010

<code>PrintStream realOut = System.out;
try {
 out = new ByteArrayOutputStream();
 System.setOut(new PrintStream(out));
 System.out.println("bla");
} finally {
 System.setOut(realOut);
}
System.out.println(out);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...