Чтение InputStream из Java-процесса - PullRequest
2 голосов
/ 26 марта 2012

Я пытаюсь открыть консоль терминала и иметь возможность читать / записывать команды для нее.

Я читаю некоторые вопросы, такие как: Процесс Java с потоком ввода / вывода

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

У меня проблема в том, что мне нужно загрузить другую консоль java с этой консоли и прочитать ее вывод, но эта программа использует java.util.logging.Logger для отправки большей части своего вывода, и по какой-то причине мое запускающее приложение не может прочитать, чтоLogger печатает.

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

Спасибо за вашу помощь.

РЕДАКТИРОВАТЬ

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

package launcher;

import java.io.*;
import java.util.Scanner;

public class Launcher {

    public static void main(String[] args) throws IOException {

        String line;
        Scanner scan = new Scanner(System.in);

        Process process = Runtime.getRuntime().exec("/bin/bash");

        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));

        while (scan.hasNext()) {
            String input = scan.nextLine();
            if (input.trim().equals("exit")) {

                writer.write("exit\n");
            } else {
                writer.write("((" + input + ") && echo --EOF--) || echo --EOF--\n");
            }
            writer.flush();

            line = reader.readLine();
            while (line != null && !line.trim().equals("--EOF--")) {
                System.out.println("Stdout: " + line);
                line = reader.readLine();
            }
            if (line == null) {
                break;
            }
        }

    }
}

Ответы [ 2 ]

1 голос
/ 26 марта 2012

Не видя никакого кода / конфигурации, я бы предположил, что либо регистратор настроен на запись в stderr (System.err), а вы только читаете stdout (System.out), либо регистратор настроен на запись вфайл.

0 голосов
/ 26 марта 2012

В ответе dty я думаю, что по умолчанию java.util.logging использует stderr, поэтому вы должны перенаправить stderr в stdout следующим образом:

ProcessBuilder builder = new ProcessBuilder("ls", "-l"); // or whatever your command is
builder.redirectErrorStream(true);
Process proc = builder.start();

По моему опыту, было бы лучше попытаться использовать другую Java-программу, запустив ее метод main в вашей собственной программе, чем пытаться бороться с потоками ввода-вывода и т. Д., Но это зависит от того, что другая программа делает.

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