2012-01-05 14 views
0

私は外部プログラムOtterをパラメータとして取得し、パラメータとして指定された出力ファイルを作成しています。 だから例えば私の入力が「proof.in」であれば、私は私の出力が「proof.out」ファイルに配置することにしたい、私は、ターミナルで次のコマンドを実行します。Javaで端末から外部プログラムを実行

otter <proof.in >proof.out 

「証拠。 in "ファイルはotter実行可能ファイルと同じファイルになければなりません。

java.lang.Runtime.getRuntime().exec("otter <proof.in >proof.out") 

が、この行の後に全体のUIが凍結され、何も起こらないと出力ファイルが生成されません:

問題

は私が私のJavaコードでので、私は次のJavaからこの機能が必要ということです。

誰でも私が間違っている場所を教えてもらえますか?事前に

おかげで、 Tamash

+0

をあなたのプログラムは、一部のユーザーの入力を期待していますか?もしそうなら、それは入力を待つでしょう。 –

+0

[私たちのjavaプログラムから別のjavaプログラムを実行する]の可能な複製(http://stackoverflow.com/questions/7770094/executing-another-java-program-from-our -java-program) –

答えて

5

これは正常です。通常、シェルによって発行されたコマンドを起動しようとしています。

ここで、<proof.in>proof.outは、シェルリダイレクトではなく、otter実行可能ファイルのリテラル引数として解釈されます。しかし、このツールのホームページを見ると、うまくいきません。リダイレクトが通常提供するstdinのデータが必要です。

あなたは、シェルでこのコマンドを起動する必要があり、好ましくは、プロセスビルダーを使用して:

final ProcessBuilder pb = new ProcessBuilder("/bin/sh", "-c", "otter <proof.in >proof.out"); 
final Process p = pb.start(); 

などなど

あなたは、プログラムが正しいから実行されることを、当然のことながら、確認する必要がありますディレクトリ - 幸運にも、ProcessBuilderもそうすることができます。

+0

+1ツールの研究 –

+0

ファンタスティックなサー!どうもありがとうございました! –

-1

あなたは、あなたのコマンドを実行したときに何が起こっているのかを見ることができる:

try { 
     Process p=Runtime.getRuntime().exec ("cmd /c dir"); 

     InputStream is = p.getInputStream(); 

     BufferedReader br = new BufferedReader (new InputStreamReader (is)); 

     String aux = br.readLine(); 

     while (aux!=null) { 
      System.out.println (aux); 

      aux = br.readLine(); 
     } 
    } 
    catch (Exception e) { 
     e.printStackTrace(); 
    } 

このコードで。

0

ここには別の質問に対するlinkがあります。これは、スレッドで非同期で正しく行う方法に関する非常に詳細な答えです。これは、メインスレッドをブロックしてGUIをハングさせない唯一の方法です。

private class ProcessResultReader extends Thread 
{ 
    final InputStream is; 
    final String type; 
    final StringBuilder sb; 

    ProcessResultReader(@Nonnull final InputStream is, @Nonnull String type) 
    { 
     this.is = is; 
     this.type = type; 
     this.sb = new StringBuilder(); 
    } 

    public void run() 
    { 
     try 
     { 
      final InputStreamReader isr = new InputStreamReader(is); 
      final BufferedReader br = new BufferedReader(isr); 
      String line = null; 
      while ((line = br.readLine()) != null) 
      { 
       this.sb.append(line).append("\n"); 
      } 
     } 
     catch (final IOException ioe) 
     { 
      System.err.println(ioe.getMessage()); 
      throw new RuntimeException(ioe); 
     } 
    } 

    @Override 
    public String toString() 
    { 
     return this.sb.toString(); 
    } 
} 

その後、あなただけのプログラムを実行したい場合は、必ずこの覚えてないので、

try 
{ 
    final Process p = Runtime.getRuntime().exec(String.format("cmd /c %s", query)); 
    final ProcessResultReader stderr = new ProcessResultReader(p.getErrorStream(), "STDERR"); 
    final ProcessResultReader stdout = new ProcessResultReader(p.getInputStream(), "STDOUT"); 
    stderr.start(); 
    stdout.start(); 
    final int exitValue = p.waitFor(); 
    if (exitValue == 0) 
    { 
     System.out.print(stdout.toString()); 
    } 
    else 
    { 
     System.err.print(stderr.toString()); 
    } 
} 
catch (final IOException e) 
{ 
    throw new RuntimeException(e); 
} 
catch (final InterruptedException e) 
{ 
    throw new RuntimeException(e); 
} 
0

のように上記のクラスを使用します。 Process p=Runtime.getRuntime().exec ("cmd /c dir"); p.waitFor();

関連する問題