Javaから外部プロセスを生成し、その入力に定期的に書き込み、コンソールであるかのように応答を読み取ることができるようにしたいと思います。ただし、多くの場合、プロセスの出力を読み取ると、何も利用できません。この種のことを(それを避けても)行うための良い習慣はありますか?
これは、機能しないものの簡略化された例です。
import org.apache.commons.exec.*;
import java.io.*;
//...
CommandLine cl = CommandLine.parse("/usr/bin/awk {print($1-1)}");
System.out.println(cl.toStrings());
Process proc = new ProcessBuilder(cl.toStrings()).start();
OutputStream os = proc.getOutputStream(); // avoiding *Buffered* classes
InputStream is = proc.getInputStream(); // to lessen buffering complications
os.write(("4" + System.getProperty("line.separator")).getBytes());
os.flush(); // Doesn't seem to flush.
// os.close(); // uncommenting works, but I'd like to keep the process running
System.out.println("reading");
System.out.println(is.read()); // read even one byte? usually is.available() -> 0
不思議なことに、OutputStreamをBufferedWriterでラップすると、一部のプロセス(cat)からは読み取ることができますが、他のプロセス(awk、grep)からは読み取ることができません。