Javaで外部コマンドの実行した結果の取得

このQ&Aのポイント
  • Javaで外部コマンドを実行する方法とその結果を取得する方法について説明します。
  • Eclipse上でJavaのプログラムを作成し、外部コマンドを実行した結果を取得しようとした際に起きる不思議な現象について解説します。
  • ブレークポイントを使用してコードをデバッグすることで問題が解決する方法を説明します。
回答を見る
  • ベストアンサー

Javaで外部コマンドの実行した結果の取得

Javaで外部コマンドを実行してその結果を取得しようとしてEclipse上で 下記サンプルを作成しました。ここで不思議なことが起きました。 下記を実行すると System.out.println(in.ready()) の部分でfalseが返り処理がwhileループの中に入らない状態です。 しかし、System.out.println(in.ready())の部分にブレークポイントを付けて1行ずつ実行していくと trueが返りwhileループの中の結果を読み取る処理にたどり着きます。 これはどういうことでしょうか。 public class Test { public static void main(String[] args) { String command = "hostname"; try { Process process = Runtime.getRuntime().exec(command); BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream())); System.out.println(in.ready());             while(in.ready()) { } in.close(); } catch(Exception e) { e.printStackTrace(); } } }

  • Java
  • 回答数1
  • ありがとう数1

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

  • ベストアンサー
  • wormhole
  • ベストアンサー率28% (1621/5657)
回答No.1

Runtime#exec()は非同期実行なので不思議でもなんでもないです。 たぶんやりたいことは以下が参考になるかと思います。 http://www.ne.jp/asahi/hishidama/home/tech/java/process.html#Process

unko347
質問者

お礼

ご回答ありがとうございます。 教えていただいたサイトにありますように waitFor()で解決しました。 ありがとうございました。

関連するQ&A

  • Javaプログラムでコマンド実行時のエラー

    Webアプリにて下記プラグラムを実行(Tomcat上で実行)したところ以下のような例外が でました。 cd /home/test/geniatagger-3.0.1 ディレクトリに移動するコマンドで失敗しているようですが Teraterm上で手入力で実行すると実行できます。 何が原因かわかりますでしょうか。 【例外】 java.io.IOException: Cannot run program "cd /home/test/geniatagger-3.0.1": java.io.IOException: error=2, No such file or directory at java.lang.ProcessBuilder.start(ProcessBuilder.java:475) at java.lang.Runtime.exec(Runtime.java:610) at java.lang.Runtime.exec(Runtime.java:483) 【実行したプログラム】 String[] command = {"cd /home/test/geniatagger-3.0.1", "./geniatagger", "I had a pen."}; Process process = Runtime.getRuntime().exec(command); //exec()が非同期実行であるため実行結果が返ってくるまで待つ int no = process.waitFor(); BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream())); String str = ""; while (in.ready()) { str = in.readLine(); System.out.println("segmentate=" + str); } in.close();

    • ベストアンサー
    • 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 わからない。

    今、卒業研究でJAVAを扱っています。 しかし、思った動作をするプログラムが作れません。 時間もなくなってきたので、okwaveに投稿しました。 お願いします。 パソコンはwindowsです。 プログラムを実行すると, (1)コマンドプロセッサでdirを実行してくれる。 (2)実行した後にファイルにする。 実行するときは[dir > dir.txt]のようにしたいです。 今まで書いてきた例をいかに描きます。 import java.io.*; public class TestExec1 { public static void main(String[] args) { try { String s1 = "dir"; Process process = Runtime.getRuntime().exec(s1); InputStream is = process.getInputStream(); BufferedReader br = new BufferedReader(new InputStreamReader(is)); String line; while ((line = br.readLine()) != null) { System.out.println(line); } } catch (Exception e) { e.printStackTrace(); } } } どこが間違っているかわかりません。 よろしくお願いします。

  • Javaで外部ファイルの実行

    Javaで外部ファイルの形態素解析ツールのjumanを実行させようとしてるのですが上手くいきません。 ソースは以下のようにしています。 public class CommandExec { /** * 外部コマンドを実行します。 * またリタンーン値で、標準出力、エラー出力 、リターンコードを取得します。 * 例: * execCommand("notepad.exe"); * * @see execCommand(String[] cmds) * ※実行するコマンドに引数(パラメータ)がある場合は、 * 以下を使用してください。 * @param cmd 実行するコマンド * @return コマンド実行結果情報を保持するString配列 * 配列[0] ⇒ 標準出力 * 配列[1] ⇒ エラー出力 * 配列[2] ⇒ リターンコード * @throws IOException 入出力エラーが発生した場合 */ String b; public static String[] execCommand(String cmd) throws IOException, InterruptedException { return execCommand(new String[] { cmd }); } /** * 外部コマンドを引数(パラメータ)を指定して実行します。 * またリタンーン値で、標準出力、エラー出力 、リターンコードを取得します。 * 例: * execCommand(new String[]{"notepad.exe","C:\test.txt"}); * * Process.waitFor()を実行していますので、外部コマンドの実行が * 終了するまでこのメソッドは待機します。 * * @see execCommand(String cmd) * ※実行するコマンドに引数がない場合は簡易的にこちらを * 使用してください。 * @param cmds 実行するコマンドと引数を含む配列 * @return コマンド実行結果情報を保持するString配列 * 配列[0] ⇒ 標準出力 * 配列[1] ⇒ エラー出力 * 配列[2] ⇒ リターンコード * @throws IOException 入出力エラーが発生した場合 */ public static String[] execCommand(String[] cmds) throws IOException, InterruptedException { String[] returns = new String[3]; String LINE_SEPA = System.getProperty("line.separator"); Runtime r = Runtime.getRuntime(); Process p = r.exec(cmds); InputStream in = null; BufferedReader br = null; try { in = p.getInputStream(); StringBuffer out = new StringBuffer(); br = new BufferedReader(new InputStreamReader(in,"sjis")); String line; while ((line = br.readLine()) != null) { out.append(line + LINE_SEPA); System.out.println(line); } System.out.print("\n"); returns[0] = out.toString(); br.close(); in.close(); in = p.getErrorStream(); StringBuffer err = new StringBuffer(); br = new BufferedReader(new InputStreamReader(in)); while ((line = br.readLine()) != null) { err.append(line + LINE_SEPA); } returns[1] = err.toString(); returns[2] = Integer.toString(p.waitFor()); return returns; } finally { if (br != null) { br.close(); } if (in != null) { in.close(); } } } public static void main(String[] args) throws IOException, InterruptedException { ArrayList a = new ArrayList(); CommandExec.execCommand(new String[]{"C:\\Program Files\\juman\\juman.exe","<","C:\\Program Files\\juman\\test1.txt"}); } } これをおなじ解析ツールのchasenを実行した場合は上手くいくのですがなぜでしょうか? chasenの場合は以下のようにしてます。 CommandExec.execCommand(new String[]{"C:\\Program Files\\ChaSen\\chasen.exe","C:\\Program Files\\Chasen\\test1.txt"}); よろしくお願いします。

    • ベストアンサー
    • Java
  • java ファイル操作

    現在javaでファイル操作しファイルの文字列を検索したりファイルに文字列を追加したりする ものを作成しています。 現状のコードはこのような感じです。 class addresskensaku{ public static void main(String[] args)throws IOException{ System.out.println("数字を選択\n1.名前で検索\n2.年齢で検索\n3.出身地で検索\n4.追加"); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String str = br.readLine(); char res = str.charAt(0); //1が選択された場合 if(res == '1' || res == '1'){ System.out.println("名前を入力してください。"); BufferedReader fn = new BufferedReader(new InputStreamReader(System.in)); String str1 = fn.readLine(); try{ FileReader freader = new FileReader("addressdata.txt"); BufferedReader breader = new BufferedReader(freader); String tmp = null; //検索 System.out.println("検索結果 :"); while((tmp=breader.readLine())!=null){ String[] words = tmp.split(","); //部分一致 if(words[0].indexOf(str1) != -1){ System.out.println(tmp); } } breader.close(); }catch(IOException e){ System.out.println("e"); } } //2が入力された場合 if(res == '2' || res == '2'){ System.out.println("年齢を入力してください。"); BufferedReader o = new BufferedReader(new InputStreamReader(System.in)); String ol = o.readLine(); try{ FileReader freader = new FileReader("addressdata.txt"); BufferedReader breader = new BufferedReader(freader); String tmp =null; //検索 while((tmp=breader.readLine())!=null){ String[] words = tmp.split(","); //完全一致 if (ol.equals(words[1])){ // System.out.println("検索結果:"); System.out.println(tmp); } } breader.close(); }catch(IOException e){ System.out.println("e"); } } //3が入力された場合 if(res == '3' || res == '3'){ System.out.println("出身地を入力してください。"); BufferedReader p = new BufferedReader(new InputStreamReader(System.in)); String pref = p.readLine(); try{ FileReader freader = new FileReader("addressdata.txt"); BufferedReader breader = new BufferedReader(freader); String tmp = null; //検索 while((tmp=breader.readLine())!=null){ String[] words = tmp.split(","); //部分一致 if(words[2].indexOf(pref) != -1){ System.out.println(tmp); } } breader.close(); }catch(IOException e){ System.out.println("e"); } } //4が入力された場合 追加 if(res == '4' || res == '4'){ //氏名入力 System.out.println("氏名を入力してください。"); BufferedReader n = new BufferedReader(new InputStreamReader(System.in)); String str2 = n.readLine(); //年齢入力 System.out.println("年齢を入力してください。"); BufferedReader o = new BufferedReader(new InputStreamReader(System.in)); String str3 = o.readLine(); //住所入力 System.out.println("住所を入力してください。"); BufferedReader a = new BufferedReader(new InputStreamReader(System.in)); String str4 = a.readLine(); //ファイルに書き込み try{ File file = new File("addressdata.txt"); FileWriter filewriter = new FileWriter(file, true); filewriter.write(str2+","+str3+","+str4+"\r\n"); filewriter.close(); }catch(IOException e){ System.out.println("e"); } } } } これをカプセル化し 各機能ごとにメソッドを分けて作ろうかなと思っています。 結果の出力はmainでやる予定です。

  • JAVAの初心者です。

    import java.io.*; class Sample1 { public static void main(String args[])throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); do{ System.out.println("1:入力文字整数確かめ"); System.out.println("2:終了"); String hako = br.readLine(); int sen = Integer.parseInt(hako); switch (sen){ case 1: System.out.println("整数を入力してください。"); String hako2 = br.readLine(); int hako3 = Integer.parseInt(hako2); if ((hako3%2)==0){ System.out.println("これは偶数ですね。"); } System.out.println("奇数ですね。"); break; case 2: System.out.println("終了いたします。"); break; } }while(sen != 2); } } 上記のように組んだのですが、}whileのところでエラー が出てしまうのです。 これってなぜなのでしょう?? 初心者特有の質問かもしれませんがご教授いただけたら嬉しいです。宜しくお願いいたします。 関係ないのかも知れませんがJDK1-5-006を使用してます。

    • ベストアンサー
    • Java
  • 今勉強中のjavaで。わからないことがあります。

    import java.io.*; class Ireru { public static void main(String args[]) throws IOException{ System.out.println("あなたは何歳ですか?"); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String str1 = br.readLine(); int num =Integer.parseInt(str1); System.out.println("あなたは" + num +"歳です。"); } } ------------------------------- import java.io.*; class Ireru { public static void main(String args[]) throws IOException{ System.out.println("あなたは何歳ですか?"); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String str1 = br.readLine(); System.out.println("あなたは" + str1 +"歳です。"); } } なぜ下では悪いのですか?なぜnum をつかないといけないかがわかりません。正確には str1とnumの違いがわからなくて困っています。何が混乱の原因ですか?

    • ベストアンサー
    • Java
  • javaでファイル操作し検索するものを作ってます

    目的はテキストファイル内の文字列に検索をかけヒットしたものを表示する というものです import java.io.*; class kensakuTest{ public static void main(String[] args)throws IOException{ System.out.println("検索方法を選択してください。\n0:学籍番号で検索\n1:名前で検索\n2:出身地で検索"); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String str = br.readLine(); char res = str.charAt(0); //0が選択された場合 if(res == '0'){ System.out.println("学籍番号を入力してください。"); BufferedReader bn = new BufferedReader(new InputStreamReader(System.in)); String str0 = fn.readLine(); char num = str0.charAt(0); try{ FileReader freader = new FileReader("addressdata.txt"); BufferedReader breader = new BufferedReader(freader); String tmp = null; while((tmp=breader.readLine())!=null){ //完全一致 if(){ System.out.println("検索結果:"); System.out.println(tmp); } } breader.close(); }catch(IOException e){ System.out.println("e"); } } //1が選択された場合 if(res == '1'){ System.out.println("名前を入力してください。"); BufferedReader fn = new BufferedReader(new InputStreamReader(System.in)); String str1 = fn.readLine(); char name = str1.charAt(0); try{ FileReader freader = new FileReader("data.txt"); BufferedReader breader = new BufferedReader(freader); String tmp = null; //検索 //部分一致 while((tmp=breader.readLine())!=null){ if(tmp.indexOf(str1) > -1){ System.out.println("結果は:"); System.out.println(tmp); } } breader.close(); }catch(IOException e){ System.out.println("e"); } } //2が入力された場合 if(res == '2'){ System.out.println("出身地を入力してください。"); BufferedReader bl = new BufferedReader(new InputStreamReader(System.in)); String belong = bl.readLine(); try{ FileReader freader = new FileReader("addressdata.txt"); BufferedReader breader = new BufferedReader(freader); String tmp = null; while((tmp=breader.readLine())!=null){ //完全一致 if(){ System.out.println("検索結果:"); System.out.println(tmp); } } breader.close(); }catch(IOException e){ System.out.println("e"); } } } } 現状はここまでできましたが完全一致の検索のやり方がわかりません。 あと問題点があるのですが 読み取るファイルがこのような場合 2000,田中 太郎,福島県 2001,福島 太郎,東京都 名前で福島 と検索をかけたとします この場合答えが 2000,田中 太郎,福島県 2001,福島 太郎,東京都 と表示されてしまいます このカンマで区切られている学籍番号、名前、出身地をうまく分け それぞれ判別する方法はないのでしょうか? よろしくおねがいします。

    • ベストアンサー
    • Java
  • if文の実行結果について

    public class Pass02 { public static void main(String[] args) throws IOException { /*入力の準備 */ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); /* 点数の入力 */ System.out.print(\"点数を入力>\"); int tensu = Integer.parseInt(br.readLine()); /* 合格判定 */ if (tensu >= 70) { System.out.println(\"合格です\"); } if (tensu >= 50) { System.out.println(\"再試験です\"); } else { System.out.println(\"不合格です\"); } } } 70点以上が合格、70点未満50点以上が再試験、50点未満は不合格と実行したいのですが、 70点を入力すると合格、再試験と実行されます。 どこが間違ってるのでしょうか?

    • ベストアンサー
    • Java
  • 【初心者です】javaで平均値を求めたいのですが...

    import java.io.*; public class ex31a { public static void main(String[] args) throws Exception { BufferedReader in = new BufferedReader(new InputStreamReader (System.in)); double sum = 0.0; while(true) { System.out.print("double> "); double x = (new Double(in.readLine())).doubleValue(); if(x == 0.0) { break; } sum = sum + x; } System.out.println("avarage = " + (sum % n)); } } 基本形はこのままで、最後の部分のSystem.out.printlnの部分を直したらいいんでしょうか。

    • ベストアンサー
    • Java

専門家に質問してみよう