我试图廉价并在Java中执行本地系统命令(uname -a
)。我希望从uname
获取输出并将其存储在String中。这样做的最佳方式是什么?目前的代码:
public class lame {
public static void main(String args[]) {
try {
Process p = Runtime.getRuntime().exec("uname -a");
p.waitFor();
BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line=reader.readLine();
while (line != null) {
System.out.println(line);
line = reader.readLine();
}
}
catch(IOException e1) {}
catch(InterruptedException e2) {}
System.out.println("finished.");
}
}
答案 0 :(得分:60)
你的方式与我可能做的事情相去甚远:
Runtime r = Runtime.getRuntime();
Process p = r.exec("uname -a");
p.waitFor();
BufferedReader b = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line = "";
while ((line = b.readLine()) != null) {
System.out.println(line);
}
b.close();
当然,处理你关心的任何例外情况。
答案 1 :(得分:7)
这是最好的方法。 您也可以使用具有可变参数构造函数的ProcessBuilder,这样您就可以保存一行或两行代码
答案 2 :(得分:2)
你在做什么看起来很好。如果您的命令只返回一个字符串,则不需要while循环,只需将reader.readLine()值存储在单个String变量中。
此外,你可能应该对这些例外做些什么,而不仅仅是吞下它们。
答案 3 :(得分:1)
我知道这很古老但仍然......
在这里阅读文章:
http://www.javaworld.com/article/2071275/core-java/when-runtime-exec---won-t.html
我的理解是,您应首先阅读已执行命令的输出和错误流,然后才能waitFor
进程的返回值。
答案 4 :(得分:0)
我知道这个问题很古老,但是我只想添加一些可能对某些人有用的信息。
如果只想从Java代码运行uname命令,最好使用System类来获取有关系统的信息。
它不仅可以消除运行terminal命令的依赖关系,而且还可以独立于操作系统运行。
系统类可以为您提供以下信息
键:值
-> os.version:操作系统版本
-> os.name:操作系统名称-> os.arch:操作系统体系结构
-> java.compiler:您正在使用的编译器的名称
-> java.ext.dirs:扩展目录路径
-> java.library.path:每次加载时搜索库的路径
-> user.dir:用户的当前工作目录
-> user.name:用户的帐户名
-> java.vm.version:JVM实现版本
-> java.vm.name:JVM实现名称
-> java.home:Java安装目录
-> java.runtime.version:JVM版本
(来源-https://www.geeksforgeeks.org/getproperty-and-getproperties-methods-of-system-class-in-java/)
ex:如果我正在运行基于Linux的系统,请说Ubuntu,以下命令将向我提供有关它的信息。
System.getProperty("os.name");