簡體   English   中英

在Java中使用Runtime.exec()

[英]using Runtime.exec() in Java

在Java中你需要做什么才能讓Runtime.exec()運行路徑上的程序? 我正在嘗試運行我已放入路徑的gpsbabel(/ usr / local / bin)。

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

不管你做什么,你必須閱讀 沒有人應該使用Runtime.exec()而不讀它。

我添加了對System.out.println(System.getenv("PATH"));的調用System.out.println(System.getenv("PATH")); 只打印出來的

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

所以由於某種原因/ usr / local / bin沒有顯示出來。 看起來這是一個MacOSX問題或Eclipse問題,而不是Java問題。 編輯: 在超級用戶上詢問此問題

它將繼承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,以防止阻塞。 否則東西會在某些情況下起作用,然后你的衍生過程將輸出不同數量的數據,一切都將停止。

有關詳細信息,請參閱此答案

這是解決方案:

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

是程序\\應用程序的可刪除位置的路徑,例如“C:\\ MyProg”

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM