2011-08-26 95 views
3

我正在執行JAVA代碼執行系統命令時遇到一個奇怪的問題。
其實我想從我的JAVA App獲得Mac OSX系統信息。
對於使用從JAVA問題執行Unix系統命令

Runtime.getRuntime().exec("system_profiler -detailLevel full");

這是工作fine.If我打印輸出,即時通訊,很是涼爽。 但是我想寫使用system_profiler。像的-xml參數此信息到plist文件爲未來use.For,即時通訊,

String cmd = "system_profiler -detailLevel full -xml > "+System.getProperty("user.home")+"/sysinfo.plist"; 
Process p = Runtime.getRuntime().exec(cmd); 

基本上這應該創建在當前用戶的主目錄plist文件中。

但是,這似乎沒有寫任何文件。

我在這裏錯過了什麼嗎?

+0

任何錯誤的痕跡? – Santosh

+0

你可以仔細檢查是否設置了user.home系統屬性? – Santosh

+0

是的,它是set.also我也嘗試在家中創建一個shell腳本,並從JAVA調用該腳本,它正在工作。 – r3dsm0k3

回答

7

我的Java不僅生疏,所以請溫柔。 ;-)

  1. Runtime.exec()不會自動使用shell執行你傳遞的命令,所以IO重定向沒有做任何事情。

  2. 如果只是用:

    "/bin/sh -c system_profiler -detailLevel full > path/file.plist" 
    

    那麼字符串將被標記化到:

    { "/bin/sh", "-c", "system_profiler", "-detailLevel", "full", ">", "path/file.plist" } 
    

    這也將行不通,因爲-c只要求單一參數。

試試這個:

String[] cmd = { "/bin/sh", "-c", "system_profiler -detailLevel full > path/file.plist" }; 
Process p = Runtime.getRuntime.exec(cmd); 

當然,你也可以只使用Process.getInputStream()讀你Process實例的輸出,並編寫成你想要的文件;從而完全跳過了shell,IO重定向等。

+0

非常好,像魅力一樣工作。 – r3dsm0k3

5

Christian.K絕對正確。下面是一個完整的例子:

public class Hello { 

    static public void main (String[] args) { 
    try { 
     String[] cmds = { 
     "/bin/sh", "-c", "ls -l *.java | tee tmp.out"}; 
     Process p = Runtime.getRuntime().exec (cmds); 
     p.waitFor(); 
     System.out.println ("Done."); 
    } 
    catch (Exception e) { 
     System.out.println ("Err: " + e.getMessage()); 
    } 
    } 
} 

如果你沒有使用管道(|)或重定向(>),那麼你會是OK與String cmd = "ls -l *.java",在原來的命令。

如果你真的想看到你的Java控制檯窗口中的任何輸出,那麼你也需要撥打Process.getInputStream()

這裏有一個很好的鏈接: Running system commands in Java applications