次のコードを検討してください。
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ファクトリーで働いている優秀な頭脳は、パイプが動作することを保証できないということです。
これどうやってするの?
grep
and ではなく、Javaコンストラクトを使用してすべての解析を行うわけではありません。sed
言語を変更したい場合、その言語で解析コードを書き直すことを強いられます。
シェルコマンドを呼び出すときにJavaにパイプ処理とリダイレクトを行わせるにはどうすればよいですか?
command | grep foo
あなたのような単純なものの特定のケースではcommand
、Javaでネイティブにフィルタリングを実行して行うほうがはるかに良いです。これにより、コードが多少複雑になりますが、全体的なリソース消費と攻撃面が大幅に削減されます。