- ベストアンサー
Runtime クラスのexecメソッドについて
javaで、Runtimeのexec()メソッドを使って、出てきた内容をJTextAreaに出力したいと思っています。つまり、JTextAreaをコマンドプロンプト風にしたいと思っています。しかし、exec()メソッドの戻り値である、Processクラスがいまいちよくわかりません。仕様書(日本語訳)を読んでもProcessクラスのgetInputStream()メソッドやgetOutputStream()メソッドの説明がいまいちピンときません。 try{ Process process = Runtime.getRuntime().exec("hogehoge"); /*---------------------------------------------------------*/ ここで、いかにしてJTextAreaに出力するのかわかりません /*---------------------------------------------------------*/ }catch(Exception e){ } どうか、わかる方よろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
#1のatonです。 Java上でコマンドプロンプトのようなインターフェイスを実現したいというtomatosukiさんの要望から考えると,#2でakinori_sさんが書かれている方法,特に2の方法が一番適切なように思います(もちろん,1の方法でも実現は可能ですが,Runtime#exec()を実行するたびにサブプロセスが起動されるので効率が悪いうえ,一貫性の観点からも2の方が好ましく感じられます)。 ただ,コマンドプロンプトが標準エラー出力をサポートしてるかどうかはこれとは別の問題です。ので,上記の方法を取ったとしても,process#getErrStream()が正しく動作するかどうかは定かではありません。 #ところで,Windowsのコマンドプロンプトのプログラムって "cmd.exe" なんですか? #ウチのWin98だと,cmd.exeというのは見当たらなくて,DOSプロンプトの実行には #"command.com"を呼ぶようなんですが…。
その他の回答 (3)
- akinori_s
- ベストアンサー率60% (21/35)
#2のakinori_sです。 #ところで,Windowsのコマンドプロンプトのプログラムって "cmd.exe" なんですか? #ウチのWin98だと,cmd.exeというのは見当たらなくて,DOSプロンプトの実行には #"command.com"を呼ぶようなんですが…。 Win95系だとcommand.comですね(^^; WinNT系ばっかり使ってたのでcmd.exeと書いてました。 補足じゃないですけど、実際にはシステムプロパティのos.name,os.versionから 切り分けるか環境変数のComSpecを使用して切り分けてました。
- akinori_s
- ベストアンサー率60% (21/35)
コマンドプロンプトと同様に動作させたいのでしたら 1.起動コマンドを 「cmd.exe /c プログラム名」で子プロセス起動する 2.「cmd.exe」で子プロセスを起動し、getOutputStream()で取得した標準入力 に対し「プログラム名+(改行)」を送る とやればいいと思います。
- aton
- ベストアンサー率47% (160/334)
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ドキュメントへ辿れますので,参考にしてください。
補足
お答えありがとうございます。プログラムの処理の流れがわかって、非常にうれしいです。しかし、どうもうまくいかないことがあるんです。 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を取得することができるのでしょうか? どうか、教えてください。