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


Автор: AndreyKS 4.2.2011, 14:12
Есть классы, которые результат (протокол работы) пропечатывают в консоль. Создал jFrame, кинул кнопку, по щелчку - создаётся класс и вызывается нужный метод. Как легко, не изменяя классы, показать на форме протокол работы в textarea например?

Добавлено через 12 минут и 2 секунды
плохо искал. Тут подобное рассматривалось http://forum.vingrad.ru/topic-131650.html 

Код


File f = new File("logFile.out");
        try {
            PrintStream printStream = new PrintStream(new BufferedOutputStream(new FileOutputStream(f)), true);
            System.setOut(printStream);
            System.setErr(printStream);
        } catch (FileNotFoundException e1) {
            e1.printStackTrace();
        }



Но как не в файл, а в элемент формы?

Автор: COVD 4.2.2011, 14:30
http://www.velocityreviews.com/forums/t149957-redirecting-system-out-println.html
http://blogs.sun.com/nickstephen/entry/java_redirecting_system_out_and

Автор: AndreyKS 4.2.2011, 15:26
спасибо!!
проблема решена

Автор: voooova 6.2.2011, 14:30
Программа выполняется 3-4 минуты и в процессе решения выводить что-то в консоль. Когда переделал этим способом, весь вывод стал выполняться в конце, т.е. 3-4 минуты программа как бы висит, а потом выводит весь реультат. А как переделать, чтоб выводила по ходу выполнения?

Автор: COVD 7.2.2011, 19:48
Код

import java.io.ByteArrayOutputStream;
import java.io.PrintStream;
import java.util.ArrayList;
import java.util.List;

public class RedirectErr {

    private static Output buffer = new Output();

    public static void main(String[] args) {
        long flushPeriod = 1000;
        startRedirect(flushPeriod);
        startDemo();
    }

    private static void startDemo() {
        while (true) {
            System.err.println("demo: " + new java.util.Date(System.currentTimeMillis()));
            try {
                Thread.currentThread().sleep(100);
            }
            catch (Exception e) {
                break;
            }
        }
    }

    public static void startRedirect(final long flushPeriodMSec) {
        System.setErr(new PrintStream(buffer));

        new Thread("FlushThread") {

            public void run() {
                while (true) {
                    try {
                        sleep(flushPeriodMSec);
                        flush();
                    }
                    catch (Exception e) {
                        break;
                    }
                }
            }
        }.start();
    }

    private static void flush() {
        List<String> list = buffer.getOutput();
        if (list != null) {
            System.out.println("begin flush: " + (new java.util.Date(System.currentTimeMillis())));
            for (String str : list) {
                System.out.println("  flushed:" + str);
            }
        }
    }

    private static class Output extends ByteArrayOutputStream {

        private List<String> output = new ArrayList();
        private StringBuilder buffer = new StringBuilder();
        private String lineSeparator = System.getProperty("line.separator");

        @Override
        public synchronized void write(byte[] b, int off, int len) {
            byte[] bytes = new byte[len];
            System.arraycopy(b, off, bytes, 0, len);
            String message = new String(bytes);

            if (message.equals(lineSeparator)) {
                StringBuilder buf = buffer;
                buffer = new StringBuilder();
                output.add(buf.toString());
            }
            else {
                buffer.append(message);
            }
        }

        /**
         * Method returns collected string messages or null if buffer is empty.
         * @return
         */
        public synchronized List<String> getOutput() {
            if (output.isEmpty()) {
                return null;
            }
            else {
                List<String> out = output;
                output = new ArrayList();
                return out;
            }
        }
    }
}

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