• ベストアンサー

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

atonの回答

  • 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

  • Runtime.exec()について

    Runtime.exec()について質問させて下さい。 現在、Windowsのサーブレット上のファイル操作で ファイルの属性ごと(読み取り専用)コピーしたいので Runtime.exec()からxcopyコマンドを呼び出してコピーしています。 (JavaのAPIでは属性ごとコピー、属性変更ができない!?ため) エディタはeclipse3.5を使用しております。 eclipse上のTomcat6.0では綺麗にコピーしてくれるのですが、 Tomcat6.0のみでの実行ではコピーできません(0個のファイルをコピー) eclipse3.5上のTomcat設定とTomcat自体のJVM設定でのJREパスは同じJRE を参照しています。常にEclipseを起動させた状態!!ってのは厳しいので なんとかTomcatのみでコピーを成功させたいので助言お願いいたします。 下記ソースで 4個の読み取り属性を強制上書きコピーしますと、表示は Eclipse3.5上では → 「4個のファイルコピーに成功」表示 Tomcat6上では   → 「0個のファイルコピーに成功」表示 となります。。。 【以下ソース】 CopyFrom = "コピー元パス"; CopyTo  = "コピー先パス"; try{  String[] cmd = new String[]{"cmd","/c","xcopy",CopyFrom+"*.*",CopyTo,"/y","/r","/k","/h"};  Runtime Run = Runtime.getRuntime();  Process process = Run.exec(cmd);  //実行結果取得  InputStream is = process.getInputStream();  BufferedReader br = new BufferedReader(new InputStreamReader(is));  String Line = null;  while((Line = br.readLine()) != null){   System.out.println(Line);  } }catch(IOException e){  System.out.println(e); } 【環境】 ・Windows Server2003 ・Java1.6.0_13(パスは通しています) ・Tomcat6.0.14

    • ベストアンサー
    • Java
  • Runtime#proccessのwait

    //Batch part RunBatch(batchName); //sleep(1000); //B-part Systems.out.println("B-part"); --------------------------------------------------------- public void RunBatch(String BatchName)throws Exception {  Process pr = null;  Runtime runtime = Runtime.getRuntime();  pr = runtime.exec("cmd.exe /c start "+BatchName);  try {    int exitCode = pr.waitFor();    if(process != null) {      process.getErrorStream().close(); process.getInputStream().close(); process.getOutputStream().close(); process.destroy(); }  } catch (Exception e) {   e.printStackTrace();  } } このままですとバッチの処理が長い場合、処理が終了する前にB-partへ 処理が移行してしまいます。 とりあえずでwaitをかけてはいるのですが、完全にバッチ処理が終了 するまでB-partへ移行させない方法はありませんでしょうか? おそらくバッチファイルから結果出力させてJAVA側でフックするとは思うのですが、具体的にどう組めばいいのかが分かりません。

    • ベストアンサー
    • Java
  • Runtime.execについての質問

    こんにちは、Makotoと申します。 Runtime.execを使って、ディレクトリを作成する プログラムを作っているのですが、下記のプログラムで ディレクトリは作成されるのですが、コマンドプロンプト画面が 立ち上がったままになってしまいます。閉じようと思い、8行目でexitコマンド を発行してみたのですが、うまくいきませんでした。このウィンドウを閉じる 方法はあるのでしょうか? 1:public class test{ 2:  public static void main(String[] args) throws Exception { 3:    Runtime rt = Runtime.getRuntime(); 4:    Process pr; 5:    try { 6:      Process proc1 = rt.exec("cmd /C start /MIN 7:               mkdir c:\\\poi\\test"); 8:      proc1 = rt.exec("command.com, /, exit"); 9:    } catch (java.io.IOException e) { 10:     System.err.println(e); 11:     System.exit(1); 12:    } 13: 14: } 15:}

    • ベストアンサー
    • Java
  • 継承クラスで定義したメソッドのtry-catch文

    親クラスで、子クラスで実装されたメソッドのExceptionをキャッチしたいのですが、 うまくいきません。 何か良い方法はないでしょうか? abstract class A { public __construct(){ try{ $this->testA(); }catch(Exception $e){ var_dump(1); } } abstract function testA(); } class B extends A { function testA(){ throw Exception('test',1); } } try{ new B; }catch(Exception $e){ var_dump(2); // こっちが動く } よろしくお願いします。

    • ベストアンサー
    • PHP
  • 外部コマンドを実行する方法

    sdk 1.4.2_08 OS WindowsXp try{ Process process = Runtime.getRuntime().exec(...); }catch(IOException e){} を使用して,コマンドを実行しようとしています.しかし,IOExceptionとなってしまいます. exec(...) に記述してある内容をコピーして,コマンドラインから実行できることは確認しましたし,パスも大丈夫でした. また空白が認識されない場合があることから, String cmd[] = {"コマンド","引数1","引数2"}; Process process = Runtime.getRuntime().exec(cmd); と行ってもダメでした. また,ためしにこのコンパイル済みのclassファイルをLinuxで動作させたところ,正常の動作できることがが確認できました.(windowsとLinuxに同じ名前のコマンドがあるのです.また,Linuxは fedora core4 です.) Windows上のコマンドに問題があるようなのですが,何か原因となる要因が,他にもありそうでしたらアドバイスお願いいたします.

    • ベストアンサー
    • Java
  • JAVAで外部ファイルの実行

    JAVAで外部ファイルを実行したいのですが、 myjbutton.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent ae){ Runtime myruntime=Runtime.getRuntime(); try{Process myprocess=myruntime.exec("cmd.exe");}catch(IOException e){}; }}); ボタンを押して、実行させたいのですが、これが 全く起動しません。notepad.exeなども試しました が無理でした。 アドバイスがあれば、教えてください。お願いします。

    • ベストアンサー
    • Java
  • Runtime.getRuntime().execの使い方

    Javaプログラムを実行するだけで、コマンドプロンプトを起動させ、 Mecabを動かしています。 try { String[] command = new String[8];  command[0] = "cmd.exe";  command[1] = "/c";  command[2] = "C:\\Program Files\\mecab\\bin\\mecab.exe";  command[3] = "-F";  command[4] = "\"%m,%f[0]\"";  command[5] = "result.txt";  command[6] = ">";  command[7] = "output.txt";  process = Runtime.getRuntime().exec(command);  以下省略 上のようにすると、output.txtにうまく出力してくれません。 ちなみに、  command[3] = "-F";  command[4] = "\"%m,%f[0]\""; の部分を省くとうまくoutput.txtに書き込まれます。 出力フォーマットを指定する方法はありますでしょうか。 またMecab単体を起動させて mecab -F "%m,%f[0]" result.txt > output.txt …(1) (1)のように入力するとうまくいきます。 Javaプログラムで(1)を実行させたいです。 よろしくお願いします。

    • ベストアンサー
    • Java
  • process has not exited

    実行可能なjarファイルをコマンド実行しその戻り値を取得したくて下記プログラムを書きました。 ところがprocess.exitValue() のところで  process has not exited というエラーを起こしてしまいます。原因はお分かりになりますでしょうか。 String command = "java -jar test.jar test; Process process = Runtime.getRuntime().exec(command); System.out.println("▼▼▼実行中のコマンド=" + command); //int no = process.waitFor(); //exec()が非同期実行であるため実行結果が返ってくるまで待つ System.out.println("▼▼▼コマンドの実行完了"); BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream())); String line = null; while ( (line = in.readLine())!=null ) { line = in.readLine(); System.out.println(line); } System.out.println("★★★コマンドの戻り値=" + process.exitValue()); if(process.exitValue() != 0) { process.destroy(); } in.close(); } } catch(Exception e) { if( process != null ) { process.destroy(); } e.printStackTrace(); }

    • ベストアンサー
    • Java
  • Java getRuntime().exec() でのパイプ利用に関して。

    はじめまして。 JavaのgetRuntime().execでコマンドプロンプトを動かそうと思っております。 コマンドプロンプトで「netstat -an | find "***"」というコマンドをJavaから実行したいと思っています。 しかし、Javaではパイプ(=|)を利用したコマンドは実行できない。 ということを検索してたどり着きました。 例などでは、「シェル」を利用しろ。などとかかれていましたが何をどうすればいいかわかりません。 String[] s = {"netstat","-an"}; Process process = Runtime.getRuntime().exec(s); 今は上記の状態で「netstat -an」が実行されています。 どうすれば「find "***"」で***の検索をかけることができるでしょうか? どうぞ、よろしくお願いいたします。

    • ベストアンサー
    • Java
  • Exceptionクラスの継承について

    Exceptionクラスを継承しているExceptionMがありますが、その中にsuper(message)というものがあります。 これは、スーパークラスのExceptionがmessageという変数を引数で受けることができるメソッドを使用していることは分かりますが、実際何を行っているのでしょうか? そして、この処理によって何を得ているのでしょうか? あと、try{のなかにtry{という変な記述していますが、問題でそうかかれていただけなので気にしないでください。 問題箇所 class ExceptionM extends Exception{ public ExceptionM(String message){ super(message); } } 全ソース class ExceptionSubclassQuestion{ public static void main(String args[]){ a(); } static void a(){ try{ try{ throw new ExceptionM("M"); }catch(ExceptionN e){ System.out.println("lnner catch"); e.printStackTrace(); } }catch(ExceptionM e){ System.out.println("Quter catch"); e.printStackTrace(); } } } class ExceptionM extends Exception{ public ExceptionM(String message){ super(message); } } class ExceptionN extends ExceptionM{ public ExceptionN(String message){ super(message); } }

    • ベストアンサー
    • Java