从JAVA问题执行Unix系统命令

Aji*_*ith 3 java macos system-information

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

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

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

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

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

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

我错过了什么吗?

Chr*_*n.K 7

我的Java不仅仅是生锈的,所以请保持温和.;-)

  1. Runtime.exec() 不自动使用shell来执行您传递的命令,因此IO重定向没有做任何事情.

  2. 如果您只是使用:

    "/bin/sh -c system_profiler -detailLevel full > path/file.plist"
    
    Run Code Online (Sandbox Code Playgroud)

    然后该字符串将被标记为:

    { "/bin/sh", "-c", "system_profiler", "-detailLevel", "full", ">", "path/file.plist" }
    
    Run Code Online (Sandbox Code Playgroud)

    哪个也行不通,因为-c只需要一个参数.

试试这个:

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

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


pau*_*sm4 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());
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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