2010-04-22 5 views
5

Próbuję odczytać wynik polecenia powłoki w buforze ciągów, odczyt i dodanie wartości jest poprawne, z wyjątkiem faktu, że dodane wartości są co drugi wiersz w wyjściu powłoki. Na przykład, mam 10 wierszy wyjścia powłoki, a ten kod przechowuje tylko 1, 3, 5, 7, 9, wiersz. Czy ktoś może wskazać, dlaczego nie jestem w stanie złapać każdego wiersza z tym kodem? wszelkie sugestie lub pomysł jest mile widziany :)Przechowywanie wyników powłoki

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

Odpowiedz

3

Każdorazowe zadzwonić input.readLine() czytasz nową linię. Nic nie robisz z tym, o czym przeczytasz w oświadczeniu while(), po prostu upuszczasz je na podłogę. Będziesz musiał tymczasowo przechowywać jego wartość i przetworzyć ją w ciele pętli.

+0

Witam, Dziękuję za odpowiedź. Próbowałem z tym również while (s.append (input.readLine())! = Null) { \t //System.out.println(line); \t s.append (input.readLine() + "\ n"); } Ale kod zostaje zatrzymany, czy możesz wkleić mi przykład? –

7

Oto kod, który ja zazwyczaj korzystają z BufferedReader w sytuacjach tak:

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'); 
} 

na zasadzie związane semi-notatki, gdy kod nie musi być bezpieczne, że lepiej jest użyć StringBuilder zamiast nici StringBuffer jako StringBuffer jest zsynchronizowany.