
環境はWindowsXPです。
対話型の外部プログラム、例えば、sqlite3やcygwinのシェルなどを
ProcessBuilderを使って対話的にやり取りする方法はありますか?
普通に
ProcessBuilder pb = new ProcessBuilder("cmd", "/C", "sqlite3.exe");
としても固まってしまいます。
作りたいもののイメージとしては、eclipseのProcessConsoleのようなものです。
これをeclipseを使わずにSWTのみで作りたいと考えています。
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);
}
}
教えて頂いたコードがやりたかった事と一致しています。
Scannerを使って標準入力を取得できるんですね。
重ね重ねありがとうございます。
No.1
- 回答日時:
こんにちは。
「固まる」とは、どういう状態になっているのでしょうか?
もう少し、詳しくお願いいたします。
また、問題が再現するサンプルコードを補足できないでしょうか?
この回答への補足
失礼しました。「固まる」というのは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が見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
InputStream.read()でタイムア...
-
equalsの逆
-
JAVAでエラーがでる。
-
以下のJAVAプログラムでご質問...
-
java連結
-
C言語のポインターに関する警告
-
System.err. printlnとSystem.o...
-
JavaScriptの変数をjavaのメソ...
-
ORA-01858: 数値を指定する箇所...
-
VBAで配列の計算
-
javaで質問です。 文字列2023/2...
-
JScrollPaneで、表示がおかしく...
-
JavaScriptを使ってロト6の当...
-
streamで送信されたArrayListを...
-
JavaScriptとVBScriptに関して
-
IF関数でEmpty値を設定する方法。
-
動的配列が存在(要素が有る)か...
-
ループ処理の際、最後だけ","を...
-
オブジェクトの中のプロパティ...
-
1~100までの数字を表示したい
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
csv出力について
-
yyyymmddからyyyy/mm/d...
-
テキストファイルから空白行をよむ
-
BufferedReaderでのエラー
-
Javaの質問です。テキストファ...
-
equalsの逆
-
戻り値を使用する呼出
-
JAVAでエラーがでる。
-
FileクラスのcanRead/canWrite...
-
Java 出席状況を表す文字列から...
-
Javaでデータに登録する度にID...
-
ファイルの読み飛ばしが出来ま...
-
九九を横に表示する。
-
javaのfor文が機能してないみた...
-
Javaの質問です。テキストファ...
-
Servletでテキストボックスに入...
-
java連結
-
java.lang.NoClassDefFoundErro...
-
拡張子の読み込み制限を設けた...
-
[JAVA]エラーが解決できません。
おすすめ情報