• ベストアンサー

ProcessBuilderを使用して、対話型の外部プログラムとやり取りするには?

環境はWindowsXPです。 対話型の外部プログラム、例えば、sqlite3やcygwinのシェルなどを ProcessBuilderを使って対話的にやり取りする方法はありますか? 普通に ProcessBuilder pb = new ProcessBuilder("cmd", "/C", "sqlite3.exe"); としても固まってしまいます。 作りたいもののイメージとしては、eclipseのProcessConsoleのようなものです。 これをeclipseを使わずにSWTのみで作りたいと考えています。

質問者が選んだベストアンサー

  • ベストアンサー
  • PecoPlus
  • ベストアンサー率76% (144/188)
回答No.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);   } }

kawaby
質問者

お礼

教えて頂いたコードがやりたかった事と一致しています。 Scannerを使って標準入力を取得できるんですね。 重ね重ねありがとうございます。

その他の回答 (1)

  • PecoPlus
  • ベストアンサー率76% (144/188)
回答No.1

 こんにちは。  「固まる」とは、どういう状態になっているのでしょうか?  もう少し、詳しくお願いいたします。  また、問題が再現するサンプルコードを補足できないでしょうか?

kawaby
質問者

補足

失礼しました。「固まる」というのは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()); のようにして、外部プログラムと対話的にやりとりできないかなと考えています。

関連するQ&A

専門家に質問してみよう