从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文件。
但这似乎没有写任何文件。
我在这里错过了什么吗?
答案 0 :(得分:7)
我的Java不仅仅是生锈的,所以请保持温柔。 ; - )
Runtime.exec()
不会自动使用shell来执行您传递的命令,因此IO重定向不执行任何操作。
如果您只是使用:
"/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()
实例的输出,并将其写入您想要的文件中;因此,完全跳过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