Хранение вывода оболочки - PullRequest
5 голосов
/ 22 апреля 2010

Я пытаюсь прочитать вывод команды оболочки в строковый буфер, чтение и добавление значений в порядке, за исключением того факта, что добавленные значения находятся на каждой второй строке в выводе оболочки. Например, у меня есть 10 строк вывода оболочки, и этот код хранит только строки 1, 3, 5, 7, 9. Кто-нибудь может указать, почему я не могу поймать каждую строку с этим кодом ??? Любое предложение или идея приветствуется:)

import java.io.*;

public class Linux {

    public static void main(String args[]) {


        try {
        StringBuffer s = new StringBuffer();

    Process p = Runtime.getRuntime().exec("cat /proc/cpuinfo");
    BufferedReader input =
            new BufferedReader(new InputStreamReader(p.getInputStream()));
    while (input.readLine() != null) {
        //System.out.println(line);
    s.append(input.readLine() + "\n");

    }
    System.out.println(s.toString());



} catch (Exception err) {
    err.printStackTrace();
}    }
}

Ответы [ 2 ]

7 голосов
/ 22 апреля 2010

Вот код, который я обычно использую с BufferedReader в таких ситуациях:

StringBuilder s = new StringBuilder();
Process p = Runtime.getRuntime().exec("cat /proc/cpuinfo");
BufferedReader input =
    new BufferedReader(new InputStreamReader(p.getInputStream()));
String line = null;
//Here we first read the next line into the variable
//line and then check for the EOF condition, which
//is the return value of null
while((line = input.readLine()) != null){
    s.append(line);
    s.append('\n');
}

На полусвязанной ноте, когда ваш код не должен быть потокобезопасным, лучше использовать StringBuilder вместо StringBuffer, поскольку StringBuffer синхронизируется.

3 голосов
/ 22 апреля 2010

Каждый раз, когда вы звоните input.readLine(), вы читаете новую строку.Вы ничего не делаете с тем, что прочитали в операторе while(), вы просто позволяете ему упасть на пол.Вам нужно будет временно сохранить его значение и обработать его в теле цикла.

...