Как выполнять системные команды (linux / bsd) с использованием Java - PullRequest
34 голосов
/ 27 апреля 2009

Я пытаюсь быть дешевым и выполнить локальную системную команду (uname -a) на Java. Я хочу получить вывод из uname и сохранить его в строке. Каков наилучший способ сделать это? Текущий код:

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.");
    }
}

Ответы [ 4 ]

60 голосов
/ 27 апреля 2009

Ваш путь не далек от того, что я, вероятно, буду делать:

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();

Разумеется, обрабатывайте любые исключения, которые вас интересуют.

7 голосов
/ 27 апреля 2009

Это лучший способ сделать это. Также вы можете использовать ProcessBuilder , который имеет конструктор переменного аргумента, так что вы можете сохранить одну или две строки кода

2 голосов
/ 27 апреля 2009

То, что вы делаете, выглядит хорошо. Если ваша команда возвращает только одну строку, вам не нужен цикл while, просто сохраните значение reader.readLine () в одной строковой переменной.

Кроме того, вы, вероятно, должны что-то сделать с этими исключениями, а не просто проглотить их.

1 голос
/ 20 апреля 2014

Я знаю, что это очень старый, но все же ...

Читая статью здесь: http://www.javaworld.com/article/2071275/core-java/when-runtime-exec---won-t.html
Насколько я понимаю, вы должны сначала прочитать выходные данные и потоки ошибок вашей выполненной команды и только затем waitFor возвращаемое значение вашего процесса.

...