Как я могу читать из BufferedReader в режиме реального времени из процесса вывода в Java? - PullRequest
1 голос
/ 19 июня 2019

Я пытаюсь прочитать данные в реальном времени из процесса с помощью BufferedReader и перенаправить их в TextArea. Тем не менее, я заметил, что когда процесс запускает .bat, он имеет тенденцию зависать и приводить к задержке в JavaFX TextArea. Поле «.bat», которое работает, выводит ..... одну строку, чтобы указать прогресс, и я считаю, что это то, где оно терпит неудачу. У меня была идея, чтобы программа подождала определенное количество времени, затем она запустилась, но из-за того, что она все в одной строке, она также перестала работать. Пожалуйста, помогите

Код:

 while(iterator.hasNext()) {
    Map.Entry mentry = (Map.Entry)iterator.next();
    String taskPath = " /k d: && cd DATA\\Virtualization\\Users && ESXRun.bat";
    ProcessBuilder pb = new ProcessBuilder("cmd",taskPath);
    Process process = pb.start();
    BufferedReader stdInput = new BufferedReader(new InputStreamReader(process.getInputStream()));

    String s = "";
    // read the output from the command

    while ((s = stdInput.readLine()) != null) {
        //TextArea
        cliLog.appendText(s);                       
        cliLog.appendText("\n");
    }
    process.waitFor();
    process.destroy();
}

1 Ответ

2 голосов
/ 19 июня 2019

Это просто концепция для демонстрации проблемы. Вы должны настроить его и обработать исключения.

public class TextAreaBash extends Application implements Runnable {

    private final TextArea textArea = new TextArea();

    public static void main(final String[] args) {
        Application.launch(args);
    }

    @Override
    public void start(final Stage primaryStage) throws Exception {
        primaryStage.setScene(new Scene(new VBox(textArea), 300, 200));
        primaryStage.show();
        ping();
    }

    public void ping() {
        new Thread(this).start();
    }

    @Override
    public void run() {
        try {
            final ProcessBuilder processBuilder = new ProcessBuilder("cmd", "/C", "ping -a www.google.com -n 10");
            final Process process = processBuilder.start();
            final InputStreamReader inputStreamReader = new InputStreamReader(process.getInputStream());
            while (appendText(inputStreamReader)) {
                ;
            }
            process.waitFor();
            process.destroy();
        } catch (final Exception ex) {
            ex.printStackTrace();
        }
    }

    private boolean appendText(final InputStreamReader inputStreamReader) {
        try {
            final char[] buf = new char[256];
            final int read = inputStreamReader.read(buf);
            if (read < 1) {
                return false;
            }
            Platform.runLater(() -> {
                textArea.appendText(new String(buf));
            });
            return true;
        } catch (final IOException e) {
            e.printStackTrace();
        }
        return false;
    }
}

ping TextArea

...