重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

環境はWindowsXPです。

対話型の外部プログラム、例えば、sqlite3やcygwinのシェルなどを
ProcessBuilderを使って対話的にやり取りする方法はありますか?

普通に
ProcessBuilder pb = new ProcessBuilder("cmd", "/C", "sqlite3.exe");
としても固まってしまいます。

作りたいもののイメージとしては、eclipseのProcessConsoleのようなものです。
これをeclipseを使わずにSWTのみで作りたいと考えています。

A 回答 (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);
  }
}
    • good
    • 0
この回答へのお礼

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

重ね重ねありがとうございます。

お礼日時:2009/06/16 20:38

 こんにちは。



 「固まる」とは、どういう状態になっているのでしょうか?
 もう少し、詳しくお願いいたします。

 また、問題が再現するサンプルコードを補足できないでしょうか?

この回答への補足

失礼しました。「固まる」というのは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());

のようにして、外部プログラムと対話的にやりとりできないかなと考えています。

補足日時:2009/06/16 16:25
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!