从 BufferedReader 读取

Reading from BufferedReader

我正在尝试在终端上执行命令。使用

        ProcessBuilder builder = new ProcessBuilder("/bin/bash");
        builder.redirectErrorStream(true);
        Process process = builder.start();
        OutputStream stdin = process.getOutputStream();
        InputStream stdout = process.getInputStream();

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

我打算用这个reader和writer来不断的和进程沟通。

我正在使用以下循环阅读

        while ((line = reader.readLine()) != null) {
        System.out.println("line);
        }

问题:这里的问题是,当 reader 开始从缓冲区读取时,它永远处于 while 循环中。它永远不会退出。

我试着把阅读放在一个线程中

public void run() {
        try {
            String line;
            outputText = "";
            while ((line = reader.readLine()) != null) {
                System.out.println(line);
            }
        } catch (IOException ex) {
            Logger.getLogger(ThreadReader.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

但现在我无法控制 reader 何时开始和完成阅读。

目标:我需要执行一个命令并读取输出,然后再读取下一个命令。

您的 Java 程序正在与外部交互进程通信。它只有流程的输出和错误流可用于确定如何从任何给定点继续进行。如果你想让它识别输出的细分,比如对单个命令的响应,那么你需要教它这些细分的边界是什么样的。

解决问题的方法有很多种。例如,如果外部程序在准备接受新命令时发出提示,那么观察该提示似乎很自然。或者,也许您可​​以调整程序的输入,使其在每个命令输出的末尾产生一个可识别的标记。

还要考虑这是一个已解决的问题(多次)。交互式程序通用脚本的规范实用程序是一个名为 "Expect" 的 Tcl 程序。它启发了许多语言的同类作品,包括 Java 中的许多人。 Google 给了我前五个点击中的三个不同的例子,但我对其中任何一个都没有具体经验,所以我不做推荐。