2010-04-22 3 views
5

Я пытаюсь прочитать вывод команды оболочки в строковый буфер, чтение и добавление значений в порядке, за исключением того факта, что добавленные значения представляют собой каждую вторую строку в выводе оболочки. Например, у меня есть 10 строк od shell output, и этот код хранит только 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(); 
} } 
} 

ответ

3

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

+0

Здравствуйте, Спасибо за ваш ответ. Я пытался с этим также While (s.append (input.readLine())! = NULL) { \t //System.out.println(line); \t s.append (input.readLine() + "\ n"); } Но код застрял, вы можете вставить мне пример? –

7

Вот код, который я обычно использую с 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 синхронизирован.

Смежные вопросы