从BufferedReader读取

时间:2016-06-01 13:24:27

标签: java process 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));

我将使用这个读者和作者不断地与过程沟通。

我使用以下循环阅读

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

问题:这里的问题是,当读者从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);
        }
    }

但现在我无法控制读者何时开始阅读。

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

1 个答案:

答案 0 :(得分:1)

您的Java程序正在与外部交互式进程通信。它只使用进程的输出和错误流来确定如何从任何给定点继续。如果您希望它识别输出的细分,例如对各个命令的响应,那么您需要教它们这些细分的边界是什么样的。

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

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