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

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

どうか、わかる方よろしくお願いします。

A 回答 (4件)

#2のakinori_sです。



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

Win95系だとcommand.comですね(^^;
WinNT系ばっかり使ってたのでcmd.exeと書いてました。
補足じゃないですけど、実際にはシステムプロパティのos.name,os.versionから
切り分けるか環境変数のComSpecを使用して切り分けてました。
    • good
    • 0

#1のatonです。



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

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

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

コマンドプロンプトと同様に動作させたいのでしたら


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

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 …

この回答への補足

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

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
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

今、見られている記事はコレ!

おしトピ編集部からのゆる~い質問を出題中

お題をもっとみる

このQ&Aを見た人が検索しているワード


このQ&Aを見た人がよく見るQ&A

このカテゴリの人気Q&Aランキング

おすすめ情報

カテゴリ