考虑以下代码:
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
当然,当我从外壳运行时,它可以按预期工作:
poundifdef@parker:~/rabbit_test$ ls /etc | grep release
lsb-release
互联网告诉我,由于管道行为不是跨平台的,因此在生产Java的Java工厂工作的才华横溢的人无法保证管道能够正常工作。
我怎样才能做到这一点?
我不会使用Java构造而不是grep
and 来进行所有解析sed
,因为如果要更改语言,我将被迫用该语言重新编写解析代码,这完全是徒劳的。
调用Shell命令时,如何使Java进行管道传输和重定向?
command | grep foo
您只需command
在Java中本地运行并进行过滤就可以了。它使您的代码稍微复杂一些,但同时也减少了总体资源消耗和攻击面。