从JAVA问题执行Unix系统命令

时间:2011-08-26 05:21:45

标签: java macos system-information

从JAVA代码执行系统命令时,我遇到了一个奇怪的问题 实际上我想从我的JAVA应用程序中获取Mac OSX系统信息 为此我正在使用

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

这很好用。如果我打印输出,很酷。 但我想将此信息写入plist文件以供将来使用。为此我使用system_profiler的-xml参数。比如,

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

基本上这应该在当前用户主目录中创建一个plist文件。

但这似乎没有写任何文件。

我在这里错过了什么吗?

2 个答案:

答案 0 :(得分: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只需要一个参数。

  3. 请改为尝试:

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

    当然,您也可以使用Process读取Process.getInputStream()实例的输出,并将其写入您想要的文件中;因此,完全跳过shell,IO重定向等。

答案 1 :(得分: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());
    }
  }
}

如果您没有使用竖线(|)或重定向(>),那么您可以使用String cmd = "ls -l *.java",就像在原始命令中一样。

如果您确实希望在Java控制台窗口中查看任何输出,那么您还需要致电Process.getInputStream()

这是一个很好的链接: Running system commands in Java applications