javaからシステムコマンドを実行するのにProcessBuilderを使用します。システムコマンドは、ユーザからの入力データを要求することができる。システムコマンドがユーザーからの入力データを複数回尋ねるとプログラムが失敗しました。直接コマンドラインからそのようなコマンドを実行しているの例:java ProcessBuilder:複数の入力でプログラムを実行
>test-input
Continue? Y/N
y
Entered y
Again: Continue? Y/N
y
Entered y
私は、「テスト入力」を実行するために私ProcessBuilderをベースのプログラムを使用している場合は、そのいずれかがハングまたは2回目の入力を取ることができませんでした。ここには、ロジックの読み書きのコードがあります。入力ストリームから読み込む出力ストリームに
ProcessBuilder pb = new ProcessBuilder(cmdList);
pb.redirectErrorStream(true);
pb.directory(new File("some-test-dir"));
process = pb.start();
InputStream is = process.getInputStream();
int value = -1;
while ((value = is.read()) != -1) {
reader.append((char)value);
}
int result = process.waitFor();
書き込み(例外処理と密接なロジックをストリーム省略されている):
public void write(String s) {
OutputStream os = null;
try {
os = process.getOutputStream();
os.write(s.getBytes(Charset.forName("UTF-8")));
}
catch (IOException e) {
//...
}
finally {
// Problematic
os.close();
}
}
問題はラインにos.closeで発生しました()。私がそこに置くと、最初の入力データが処理された後に出力ストリームが閉じられるので、再オープンすることはできず、プログラムは2番目の入力データを取ることができません。出力ストリームを閉じないと、is.read()が永久にブロックされるため、プログラムがハングします。この問題を解決するには?で説明したように感謝
()process.getOutputStreamを呼び出して保管しないでください。プロセスごとに 'new OuptutStreamWriter(process.getOutputStream())'を1回呼び出して、それを使用してください。書き込みのたびにライターの 'flush()'メソッドを呼び出します。 (直接関係はありません:1バイトが1文字であると仮定するのは間違いです。プロセスのInputStreamをInputStreamReaderにラップし、InputStreamReaderのreadメソッドを使用してください)。 – VGR
1バイトと1文字の関係を指摘してくれてありがとう – CMZS