2010-04-22 8 views
5

Estoy tratando de leer el resultado de un comando de shell en un buffer de cadena, la lectura y adición de los valores está bien excepto por el hecho de que los valores agregados son cada segunda línea en el resultado de shell. por ejemplo, tengo 10 filas de salida od shell y este código solo almacena la fila 1, 3, 5, 7, 9. ¿Alguien puede señalar por qué no puedo atrapar cada fila con este código? cualquier sugerencia o idea es bienvenida :)Almacenamiento de salida de shell

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

Respuesta

3

Cada vez que llame input.readLine() estás leyendo una nueva línea. No estás haciendo nada con lo que lees dentro de la declaración while(), simplemente lo dejas caer por los suelos. Necesitará almacenar temporalmente su valor y procesarlo dentro del cuerpo del bucle.

+0

Hola, Gracias por su respuesta. he intentado con esto también tiempo (s.append (input.readLine())! = Null) { \t //System.out.println(line); \t s.append (input.readLine() + "\ n"); } Pero el código queda trabado, ¿puedes pegarme un ejemplo? –

7

Aquí está el código que normalmente utilizo con BufferedReader en situaciones como esta:

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

En una nota semi-relacionados, cuando el código no tiene por qué ser seguro para subprocesos es mejor utilizar StringBuilder en lugar de StringBuffer como StringBuffer está sincronizado.

Cuestiones relacionadas