• ベストアンサー

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

javaで、Runtimeのexec()メソッドを使って、出てきた内容をJTextAreaに出力したいと思っています。つまり、JTextAreaをコマンドプロンプト風にしたいと思っています。しかし、exec()メソッドの戻り値である、Processクラスがいまいちよくわかりません。仕様書(日本語訳)を読んでもProcessクラスのgetInputStream()メソッドやgetOutputStream()メソッドの説明がいまいちピンときません。 try{ Process process = Runtime.getRuntime().exec("hogehoge"); /*---------------------------------------------------------*/ ここで、いかにしてJTextAreaに出力するのかわかりません /*---------------------------------------------------------*/ }catch(Exception e){ } どうか、わかる方よろしくお願いします。

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

  • ベストアンサー
  • aton
  • ベストアンサー率47% (160/334)
回答No.3

#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)
回答No.4

#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)
回答No.2

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

  • aton
  • ベストアンサー率47% (160/334)
回答No.1

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ドキュメントへ辿れますので,参考にしてください。

参考URL:
http://java.sun.com/j2se/1.3/ja/docs/ja/api/java/io/package-summary.html
tomatosuki
質問者

補足

お答えありがとうございます。プログラムの処理の流れがわかって、非常にうれしいです。しかし、どうもうまくいかないことがあるんです。 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を取得することができるのでしょうか? どうか、教えてください。

関連するQ&A

専門家に質問してみよう