0

r.exec でいくつかの単純なコマンド ライン関数を呼び出す際に問題が発生しています。何らかの理由で、ファイル X を指定すると、コマンド 'echo full/path/to/X' が正常に動作します (ディスプレイと 'p.exitValue の両方で) ()==0'、しかし 'cat full/path/to/X' はそうではありません (そして 'p.exitValue()==1' を持っています) - 'cat' と 'echo' の両方が私の /bin/ に住んでいますOSX - 何か不足していますか? コードは以下にあります (たまたま、コードを改善するための提案は大歓迎です...)

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;
    }
4

1 に答える 1

2

stdout と stderr を非同期的に消費する必要があります。

そうしないと、コマンドの出力が入力バッファーをブロックし、すべてが停止する可能性があります (catこれは、よりもはるかに多くの情報をダンプするため、コマンドで発生している可能性がありますecho)。

waitFor()また、 2回電話する必要はないと思います。

出力消費の詳細については、この SO の回答を確認してください。その他の落とし穴については、この JavaWorldの記事を確認してください。Runtime.exec()

于 2012-08-13T10:31:07.683 に答える