4

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

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);
        }
    }
}
4

3 に答える 3

3

System.out.println(System.getenv("PATH"));印刷のみの通話を追加しました

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

そのため、何らかの理由で /usr/local/bin が表示されません。これは Java の質問ではなく、MacOSX の質問または Eclipse の質問のようです。編集:代わりにスーパーユーザーでこの質問をしました。

于 2009-08-23T19:18:14.663 に答える
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 を同時に使用する必要があります。そうしないと、状況によっては機能しますが、生成されたプロセスは異なる量のデータを出力し、すべてが停止します。

詳細については、この回答を参照してください。

于 2009-08-23T19:15:45.527 に答える