3

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

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

这工作正常。如果我打印输出,它很酷。但我想将此信息写入文件以供将来使用。为此我使用.like plist的 -xml 参数,system_profiler

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

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

但这似乎没有将任何内容写入文件。

我在这里错过了什么吗?

4

2 回答 2

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实例的输出Process.getInputStream()并将其写入所需的文件;因此完全跳过外壳、IO 重定向等。

于 2011-08-26T05:31:38.657 回答
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().

这是一个很好的链接: 在 Java 应用程序中运行系统命令

于 2011-08-26T06:01:01.937 回答