如何使管道使用Runtime.exec()?

如何使管道使用Runtime.exec()?

考虑以下代码:

String commandf = "ls /etc | grep release";try {

    // Execute the command and wait for it to complete
    Process child = Runtime.getRuntime().exec(commandf);
    child.waitFor();

    // Print the first 16 bytes of its output
    InputStream i = child.getInputStream();
    byte[] b = new byte[16];
    i.read(b, 0, b.length); 
    System.out.println(new String(b));} catch (IOException e) {
    e.printStackTrace();
    System.exit(-1);}

该程序的输出是:

/etc:adduser.co

当然,当我从shell运行时,它按预期工作:

poundifdef@parker:~/rabbit_test$ ls /etc | grep release
lsb-release

互联网告诉我,由于管道行为不是跨平台的,在Java工厂生产Java的聪明人不能保证管道工作。

我该怎么做?

我不打算使用Java构造来进行所有的解析,而不是grepsed,因为如果我想改变语言,我将被迫用该语言重写我的解析代码,这完全是不可能的。

如何让Java在调用shell命令时进行管道和重定向?


开满天机
浏览 918回答 3
3回答

偶然的你

编写一个脚本,执行脚本而不是单独的命令。管道是外壳的一部分,所以您也可以这样做:String[] cmd = {"/bin/sh","-c","ls /etc | grep release"};Process p = Runtime.getRuntime().exec(cmd);

慕姐4208626

创建一个运行时来运行每个进程。从第一个运行时获取OutputStream,并从第二个运行时将其复制到InputStream中。
打开App,查看更多内容
随时随地看视频慕课网APP