OKWAVEのAI「あい」が美容・健康の悩みに最適な回答をご提案!
-PR-
解決
済み

Runtime クラスのexecメソッドについて

  • すぐに回答を!
  • 質問No.199240
  • 閲覧数624
  • ありがとう数1
  • 気になる数0
  • 回答数4
  • コメント数0

お礼率 26% (46/175)

javaで、Runtimeのexec()メソッドを使って、出てきた内容をJTextAreaに出力したいと思っています。つまり、JTextAreaをコマンドプロンプト風にしたいと思っています。しかし、exec()メソッドの戻り値である、Processクラスがいまいちよくわかりません。仕様書(日本語訳)を読んでもProcessクラスのgetInputStream()メソッドやgetOutputStream()メソッドの説明がいまいちピンときません。

try{
Process process = Runtime.getRuntime().exec("hogehoge");
/*---------------------------------------------------------*/
ここで、いかにしてJTextAreaに出力するのかわかりません
/*---------------------------------------------------------*/
}catch(Exception e){
}

どうか、わかる方よろしくお願いします。
通報する
  • 回答数4
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

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

  • 回答No.3
レベル11

ベストアンサー率 47% (160/334)

#1のatonです。

Java上でコマンドプロンプトのようなインターフェイスを実現したいというtomatosukiさんの要望から考えると,#2でakinori_sさんが書かれている方法,特に2の方法が一番適切なように思います(もちろん,1の方法でも実現は可能ですが,Runtime#exec()を実行するたびにサブプロセスが起動されるので効率が悪いうえ,一貫性の観点からも2の方が好ましく感じられます)。

ただ,コマンドプロンプトが標準エラー出力をサポートしてるかどうかはこれとは別の問題です。ので,上記の方法を取ったとしても,process#getErrStream()が正しく動作するかどうかは定かではありません。

#ところで,Windowsのコマンドプロンプトのプログラムって "cmd.exe" なんですか?
#ウチのWin98だと,cmd.exeというのは見当たらなくて,DOSプロンプトの実行には
#"command.com"を呼ぶようなんですが…。
-PR-
-PR-

その他の回答 (全3件)

  • 回答No.1
レベル11

ベストアンサー率 47% (160/334)

199240 process.getOutputStream() で得られる OutputStream -> 子プロセスの標準入力 process.getInputStream() で得られる InputStream <--- 子プロセスの標準出力 process.getErrorStream() で得られる InputStream <--- 子プロセスの標準エラー出力 (矢印の ...続きを読む
199240
process.getOutputStream() で得られる OutputStream -> 子プロセスの標準入力
process.getInputStream() で得られる InputStream <--- 子プロセスの標準出力
process.getErrorStream() で得られる InputStream <--- 子プロセスの標準エラー出力
(矢印の向きに注意)

ということだと思いますので,

1) process.getInputStream()(と process.getErrorStream() )で得られる InputStream を
2) java.io.InputStreamReader でラップしてやって
(たぶんそれをさらに java.io.BufferedReader でラップしたほうが良い)
(この時,文字のエンコーディングに注意)
3) InputStreamReader#read()(あるいは BufferedReader#read() )を使って文字を取得し,
4) それを JTextArea に描画する

というプログラムを組めばいいのではないかと思います。

参考URLからInputStreamReader/BufferedReaderクラスのAPIドキュメントへ辿れますので,参考にしてください。
補足コメント
tomatosuki

お礼率 26% (46/175)

お答えありがとうございます。プログラムの処理の流れがわかって、非常にうれしいです。しかし、どうもうまくいかないことがあるんです。

process.getInputStream()ではInputStream を得ることができましたが、
process.getErrorStream()ではInputStream を得ることができません。
/*
1 try{
2     Process process ;
3     process = Runtime.getRuntime().exec("*****");
4     process.getInputStream();
5     process.getErrorStream();
6 }catch(Exception e){
7     System.out.println("Error");
8 }
*/

このとき*****の値が例えば、"java"とすれば、Command Promptで"java"と、入力したように、javaコマンドのヘルプが表示することができたのですが、
*****の値を"tekitou"(適当)にした場合、「コマンドまたはファイル名が正しくありません」と表示されるのを期待しているのですが、3行目で例外処理が行われてしまうため、process.getErrorStream でInputStreamを取得することができません。
また、*****の値を"dir"としても、例外処理が発生してしまい、ディレクトリ情報を取得することができません。


いったいどのように、すれば、process.getErrorStreamで、InputStreamを取得することができるのでしょうか?
どうか、教えてください。
投稿日時 - 2002-01-18 02:43:13


  • 回答No.2
レベル8

ベストアンサー率 60% (21/35)

コマンドプロンプトと同様に動作させたいのでしたら 1.起動コマンドを 「cmd.exe /c プログラム名」で子プロセス起動する 2.「cmd.exe」で子プロセスを起動し、getOutputStream()で取得した標準入力   に対し「プログラム名+(改行)」を送る とやればいいと思います。
コマンドプロンプトと同様に動作させたいのでしたら
1.起動コマンドを 「cmd.exe /c プログラム名」で子プロセス起動する
2.「cmd.exe」で子プロセスを起動し、getOutputStream()で取得した標準入力
  に対し「プログラム名+(改行)」を送る
とやればいいと思います。
  • 回答No.4
レベル8

ベストアンサー率 60% (21/35)

#2のakinori_sです。 #ところで,Windowsのコマンドプロンプトのプログラムって "cmd.exe" なんですか? #ウチのWin98だと,cmd.exeというのは見当たらなくて,DOSプロンプトの実行には #"command.com"を呼ぶようなんですが…。 Win95系だとcommand.comですね(^^; WinNT系ばっ ...続きを読む
#2のakinori_sです。

#ところで,Windowsのコマンドプロンプトのプログラムって "cmd.exe" なんですか?
#ウチのWin98だと,cmd.exeというのは見当たらなくて,DOSプロンプトの実行には
#"command.com"を呼ぶようなんですが…。

Win95系だとcommand.comですね(^^;
WinNT系ばっかり使ってたのでcmd.exeと書いてました。
補足じゃないですけど、実際にはシステムプロパティのos.name,os.versionから
切り分けるか環境変数のComSpecを使用して切り分けてました。
このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


いま みんなが気になるQ&A

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ