2009-08-23 3 views
4

パスにあるプログラムを実行するためにRuntime.exec()を取得するには、Javaで何をする必要がありますか?私はパスに入れたgpsbabel(/ usr/local/bin)を実行しようとしています。JavaでRuntime.exec()を使用する

public class GpxLib { 

    public static void main(String[] args) { 
     try 
     { 
      Runtime r = Runtime.getRuntime(); 
      Process p = r.exec("gpsbabel -i garmin -f usb: -o gpx -F -"); 
      InputStream is = p.getInputStream(); 
      BufferedReader br = new BufferedReader(new InputStreamReader(is)); 
      while (true) 
      { 
       String s = br.readLine(); 
       if (s == null) 
        break; 
       System.out.println(s); 
      } 
      br.readLine(); 
     } catch (IOException e) { 
      e.printStackTrace(System.err); 
     } 
    } 
} 
+0

ProcessBuilder proc = new ProcessBuilder("<Directory PAth>" + "Executable.exe"); proc.redirectOutput(ProcessBuilder.Redirect.INHERIT); proc.directory(fi); //fi = the output directory path proc.start(); 

は、例えば "\ MYPROG \ C" プログラム\アプリケーションのexcutableが配置されているパスですか? –

答えて

2

Javaプロセスからパスを継承します。 Javaプロセスがどのような環境にあっても、生成されたプロセスにも同様の処理が行われます。ここで環境を確認する方法は次のとおりです。

Map<String, String> env = System.getenv(); 
for (String envName : env.keySet()) { 
    System.out.format("%s=%s%n", envName, env.get(envName)); 
} 

あなたはPATHそれをエクスポートを設定することがありますか?エクスポートしないと、サブプロセスでは使用できません。

さらに、は、ブロッキングを防ぐために、はstdoutとstderrを同時に消費する必要があります。そうでなければ、いくつかの状況では動作しますが、生成されたプロセスは異なる量のデータを出力し、すべてが停止するようになります。

詳細はthis answerを参照してください。

+0

私はパスを一切設定していません。 Eclipseとbashのデフォルトパスは何でも構いません。 –

+0

パスはユーザーごとに設定されます。 .bashrcにその実行可能ファイルのパスエントリを追加することができます(ツールバーなどからEclipseを起動している場合には再度ログインします) –

+0

*実際の*ソリューションはバイナリへの完全なパスを指定することだと思いますが、ただし、プログラムが環境に依存しないようにして、それを構成項目にしてください。それは、通常、私の*戦略的アプローチです。 –

3

何をしても、thisを読む必要があります。誰もそれを読まずにRuntime.exec()を使うべきではありません。

+0

これは既に見つかりました...パスについては全く話さない –

3

私だけは/ usr/local/binには表示されません何らかの理由でそう

/usr/bin:/bin:/usr/sbin:/sbin 

を出力System.out.println(System.getenv("PATH"));への呼び出しを追加しました。 Javaの質問ではなく、MacOSXの質問やEclipseの質問のようです。 編集:this question on superuserと尋ねました。ここで

+0

私の変更された回答を参照してください。変数と輸出 –

2

はソリューションです:あなたはどのようなエラー/行動を見ている

+0

誰もこのコードで何が間違っていることを説明することができますか?私はそれでC++コンソールアプリケーションを呼び出すことによって正常にテストされました。 – DareDevil

関連する問題