Получить консольный текст в Java - PullRequest
1 голос
/ 05 февраля 2011

Есть ли способ получить выходные данные с консоли, которые были выведены с помощью:

System.out.print("blabla");

Ответы [ 3 ]

5 голосов
/ 05 февраля 2011

Если вы хотите видеть то, что вы уже записали на консоль, вам нужно написать собственную реализацию PrintStream, которая просто оборачивает существующую PrintStream, сохраняет все, что она должна написать, а затем делегирует ( все методы) в завернутый (оригинал) PrintStream для выполнения фактической работы. То, как вы храните сообщения, полностью зависит от ваших потребностей (храните только последнюю записанную строку, сохраняйте карту метки времени -> строку или что-то еще). Получив это, вы можете заменить System.out своей собственной реализацией (через System.setOut()):

public class RememberAllWrittenTextPrintStream extends PrintStream {

    private static final String newLine = System.getProperty("line.separator");

    private final StringBuffer sb = new StringBuffer();
    private final PrintStream original;

    public RememberAllWrittenTextPrintStream(PrintStream original) {
        this.original = original;
    }

    public void print(double d) {
        sb.append(d);
        original.print(d);
    }

    public void print(String s) {
        sb.append(s);
        original.print(s);
    }

    public void println(String s) {
        sb.append(s).append(newLine);
        original.println(s);
    }

    public void println() {
        sb.append(newLine);
        original.println();
    }

    public void printf(String s, Object... args) {
        sb.append( String.format(s, args) );
        original.printf(s, args);
    }


    // .....
    // the same for ALL the public methods in PrintStream....
    // (your IDE should help you easily create delegates for the `original` methods.)

    public String getAllWrittenText() {
        return sb.toString();
    }

}

Вам также может понадобиться позаботиться о безопасности потоков (StringBuffer является потокобезопасным, но вам может потребоваться больше, чем это).

После того, как у вас есть выше, вы можете:

RememberAllWrittenTextPrintStream ps
        = new RememberAllWrittenTextPrintStream(System.out);
System.setOut(ps);
System.out.print("bla");
System.out.print("bla");
ps.getAllWrittenText(); // should now return "blabla"

EDIT: добавлены println() реализации, использующие независимую от платформы newLine.

0 голосов
/ 05 февраля 2011

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

http://logging.apache.org/index.html и http://www.javaworld.com/javaworld/jw-12-2004/jw-1220-toolbox.html

0 голосов
/ 05 февраля 2011

Если я вас понял, вы можете запустить процесс из Java и прочитать его вывод следующим образом:

ProcessBuilder builder = new ProcessBuilder("/bin/bash");
builder.redirectErrorStream(true);
Process process = builder.start();

OutputStream stdin = process.getOutputStream ();
InputStream stderr = process.getErrorStream ();
InputStream stdout = process.getInputStream ();

BufferedReader reader = new BufferedReader (new InputStreamReader(stdout));
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(stdin));

String input = scan.nextLine();
...

Если вам нужно более сложное управление любым процессом (доступ по pid, name и т. Д.), Это действительно хорошая библиотека: Java Service Wrapper

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...