
環境は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で質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) プログラムの勉強のおすすめは 7 2022/12/09 20:09
- その他(セキュリティ) 役所など、情報系システムのセキュリティが弱くても業務システムに問題ないか 3 2022/11/02 16:38
- 格安スマホ・SIMフリースマホ SIMフリースマホ(Android限定)米国で通話ができる実売3万円台の電池が持つ端末はないですか? 6 2022/11/12 11:42
- デスクトップパソコン パソコンが重くなった 34 2022/06/14 19:41
- スピーカー・コンポ・ステレオ 普通のAC100v電源パワースピーカーを、路上でこういうミニアンプ9v電池で鳴らせる改造可能か? 4 2023/02/07 13:28
- その他(暮らし・生活・行事) モニタ上部の余ったスペースを収納にする方法 3 2023/03/12 17:40
- その他(ブラウザ) python から COBOL を呼び出すことは可能でしょうか。 1 2023/04/21 21:03
- C言語・C++・C# exeファイルが作れない(windows10) 6 2022/08/13 08:47
- バッグ・財布 ヴィトンの長財布ヴェルティカルを買おうと思っているのですが嫁は全部開くのは小銭が使いにくそう。 札も 2 2022/06/10 22:40
- その他(ブログ) ブログの作成 2 2023/06/25 09:11
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ファイルの読み込み
-
ファイル内の言葉を検索して抽...
-
初心者です。教えてください!
-
[JAVA]エラーが解決できません。
-
今勉強中のjavaで。わからない...
-
javaでCSVの中身から最大値を表...
-
Javaのプログラミングでわから...
-
yyyymmddからyyyy/mm/d...
-
入力文字列が数字かどうかの判別
-
InputStream.read()でタイムア...
-
Class.forNameでエラーになる
-
BufferedReaderでのエラー
-
Javaでデータに登録する度にID...
-
Javaで文字と数字が混ざったも...
-
System.err. printlnとSystem.o...
-
C言語のポインターに関する警告
-
JSPやサーブレットでSystem.out...
-
数値⇒漢数字変換 java
-
1~100までの数字を表示し、か...
-
Javaで改行などが出来ないのです。
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
yyyymmddからyyyy/mm/d...
-
テキストファイルから空白行をよむ
-
InputStream.read()でタイムア...
-
九九を横に表示する。
-
equalsの逆
-
Java int sum = 0は必要ですか?
-
csv出力について
-
BufferedReaderでのエラー
-
テキストファイルにおいて任意...
-
FileクラスのcanRead/canWrite...
-
[JAVA]エラーが解決できません。
-
Javaの質問です。テキストファ...
-
テキストファイルの任意の文字...
-
JAVAで、SSL通信
-
Class.forNameでエラーになる
-
javaのファイル読み込み時の文...
-
JAVAでエラーがでる。
-
Web上に表示されたデータをcsv...
-
java連結
-
linuxでapache poiが動かない。
おすすめ情報