- ベストアンサー
ProcessBuilderを使用して、対話型の外部プログラムとやり取りするには?
環境はWindowsXPです。 対話型の外部プログラム、例えば、sqlite3やcygwinのシェルなどを ProcessBuilderを使って対話的にやり取りする方法はありますか? 普通に ProcessBuilder pb = new ProcessBuilder("cmd", "/C", "sqlite3.exe"); としても固まってしまいます。 作りたいもののイメージとしては、eclipseのProcessConsoleのようなものです。 これをeclipseを使わずにSWTのみで作りたいと考えています。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
使ったことないので、よくわからないのですが、sqlite3は、cmd.exeと同じで順次コマンドを入力していくタイプですよね。 たぶん、exit的なコマンドを入力しないと終了しないのだと思います。 すると困ったことに、 while ((line = br.readLine()) != null) { System.out.println(line); } ここを抜け出ることはできません。 終了しない限りこのループを抜けられませんし、終了するにはexitコマンドを入力しなくてはいけません。 しかし、コマンドを入力するには、このループを抜けなくてはいけない。 宝箱の中の鍵みたいなことになってます。 問題は、前の質問と同じ、一つのスレッドでどうにかしようとしていることにあります。 サンプル書くとこんな感じでしょうか。 sqlite3がないので、cmd.exe で代用しています。 (コンパイルするときは全角スペースを半角スペースに変換してからにしてください) import java.io.IOException; import java.io.PrintWriter; import java.util.Scanner; public class Main implements Runnable { Process p; public static void main(String[] args) { ProcessBuilder pb = new ProcessBuilder("cmd", "/K"); Process p; try { p = pb.start(); } catch (IOException ex) { ex.printStackTrace(); return; } Main main = new Main(); main.p = p; (new Thread(main)).start(); PrintWriter pw = new PrintWriter(p.getOutputStream(), true); Scanner in = new Scanner(System.in); while (in.hasNextLine()) { pw.println(in.nextLine()); } in.close(); } public void run() { Scanner cmdIn = new Scanner(p.getInputStream()); while(cmdIn.hasNextLine()) { System.out.println(cmdIn.nextLine()); } cmdIn.close(); System.exit(0); } }
その他の回答 (1)
- PecoPlus
- ベストアンサー率76% (144/188)
こんにちは。 「固まる」とは、どういう状態になっているのでしょうか? もう少し、詳しくお願いいたします。 また、問題が再現するサンプルコードを補足できないでしょうか?
補足
失礼しました。「固まる」というのはeclipseで強制的に終了ボタンを押さないと、プログラムが終わらないという意味です。 ソースコードは以下になります。 ProcessBuilder pb = new ProcessBuilder("cmd", "/C", "sqlite3"); process = pb.start(); BufferedReader br = new BufferedReader(new InputStreamReader(in)); while ((line = br.readLine()) != null) { System.out.println(line); } br.close(); 上のコードに対し、 OutputStream out = process.getOutputStream(); out.write(".help".getBytes()); のようにして、外部プログラムと対話的にやりとりできないかなと考えています。
お礼
教えて頂いたコードがやりたかった事と一致しています。 Scannerを使って標準入力を取得できるんですね。 重ね重ねありがとうございます。