2016-12-12 74 views
0

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()が永久にブロックされるため、プログラムがハングします。この問題を解決するには?で説明したように感謝

+1

()process.getOutputStreamを呼び出して保管しないでください。プロセスごとに 'new OuptutStreamWriter(process.getOutputStream())'を1回呼び出して、それを使用してください。書き込みのたびにライターの 'flush()'メソッドを呼び出します。 (直接関係はありません:1バイトが1文字であると仮定するのは間違いです。プロセスのInputStreamをInputStreamReaderにラップし、InputStreamReaderのreadメソッドを使用してください)。 – VGR

+0

1バイトと1文字の関係を指摘してくれてありがとう – CMZS

答えて

関連する問題