如何使用Java执行系统命令(linux / bsd)

时间:2009-04-27 01:50:53

标签: java output-redirect

我试图廉价并在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.");
    }
}

5 个答案:

答案 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");