Runtime.exec - 适用于'echo''但不适用于cat ...

时间:2012-08-13 10:29:09

标签: java command-line runtime.exec cat

我在使用r.exec调用一些简单的命令行函数时遇到问题 - 出于某种原因,给定一个文件X命令 'echo full / path / to / X'工作正常(在显示中和'p.exitValue()== 0',但'cat full / path / to / X'没有(并且有'p.exitValue' ()== 1') - 我的OSX上的'bin'和'echo'都存在于/ bin /中 - 我错过了什么?代码在下面(因为它发生了,一般来说,任何改进代码的建议都是受欢迎的... )

private String takeCommand(Runtime r, String command) throws IOException {
        String returnValue;
        System.out.println("We are given the command" + command);
        Process p = r.exec(command.split(" "));
        InputStream in = p.getInputStream();
        BufferedInputStream buf = new BufferedInputStream(in);
        InputStreamReader inread = new InputStreamReader(buf);
        BufferedReader bufferedreader = new BufferedReader(inread);
        // Read the ls output
        String line;
        returnValue = "";
        while ((line = bufferedreader.readLine()) != null) {
            System.out.println(line);
            returnValue = returnValue + line;
        }
        try {// Check for  failure
            if (p.waitFor() != 0) {
                System.out.println("XXXXexit value = " + p.exitValue());
            }
        } catch (InterruptedException e) {
            System.err.println(e);
        } finally {
            // Close the InputStream
            bufferedreader.close();
            inread.close();
            buf.close();
            in.close();
        }
        try {// should slow this down a little
            p.waitFor();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return returnValue;
    }

1 个答案:

答案 0 :(得分:2)

您应该异步使用stdout和stderr

否则命令的输出可能会阻塞输入缓冲区然后一切都停止(这可能是你的cat命令发生的事情,因为它会转储比{{1}更多的信息})。

我也不希望两次致电echo

查看this SO answer以获取有关输出消费的更多信息,并查看this JavaWorld文章以了解更多waitFor()个陷阱。