【Java】ProcessBuilderで外部プログラムと対話する

Javaで外部プログラムの呼び出しはProcessBuilderですが、外部プログラムがもし、標準入出力で対話してくる場合、非常に扱いがめんどくさくなります。

 

外部プログラムの出力はProcessのgetInputStreamメソッドでストリームから読み込むのですが、もし外部プログラムが入力待ちになったらread()メソッドで処理が止まってしまいます。

そこで、外部プログラムから受け取った文字が入力待ちの前の文字ならストリームからの入力をやめる。という処理をします。

この場合想定しうる入力待の前の文字列すべてで条件判定しなきゃなのでもっといい方法だれか教えてください。

 

そして、外部のプログラムに出力するには

BufferedWriterで

write()、newLine()、flush()

のメソッドを順番に呼べば外部のプログラムへ出力できます。

public class Main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		try {

			ProcessBuilder builderRun =new ProcessBuilder("プログラムのパス","引数");
			builderRun.directory(new File("設定したいカレントディレクトリのパス"));
			Process process = builderRun.start();
			
			String command = "";
			BufferedReader reader =new BufferedReader(new InputStreamReader(process.getInputStream()));
			BufferedWriter writer =new BufferedWriter(new OutputStreamWriter(process.getOutputStream()));
			BufferedReader stdReader = new BufferedReader(new InputStreamReader(System.in));
			while(!command.equals("-999")){
				
				String line = "";

				while(!line.equals("入力待ちになる前の文章")){
					line =reader.readLine();
					System.out.println(line);
				}
				
				System.out.print("Command : ");
				command = stdReader.readLine();
				writer.write(command);
				writer.newLine();
				writer.flush();
			}
			stdReader.close();
			writer.close();
			reader.close();
		    
			process.destroy();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	

}

完全に私的メモ

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください