2010-04-22 8 views
5

J'essaie de lire la sortie d'une commande shell dans un tampon de chaîne, la lecture et l'ajout des valeurs sont corrects sauf pour le fait que les valeurs ajoutées sont toutes les deux lignes dans la sortie shell. par exemple, j'ai 10 lignes od sortie shell et ce code ne stocke que les lignes 1, 3, 5, 7, 9 ,. Quelqu'un peut-il souligner pourquoi je ne suis pas capable d'attraper chaque ligne avec ce code ??? toute suggestion ou idée est bien accueillie :)Stockage de la sortie du 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(); 
} } 
} 

Répondre

3

Chaque fois que vous appelez input.readLine() vous lisez une nouvelle ligne. Vous ne faites rien avec celui que vous avez lu dans la déclaration while(), vous le laissez tomber sur le sol. Vous devrez stocker temporairement sa valeur et la traiter dans le corps de la boucle.

+0

Bonjour, Merci pour votre réponse. J'ai essayé avec cela aussi while (s.append (input.readLine()) = null) { \t //System.out.println(line); \t s.append (input.readLine() + "\ n"); } Mais le code est bloqué, pouvez-vous me coller un exemple ?? –

7

Voici le code que j'utilise généralement avec BufferedReader dans des situations comme celle-ci:

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

Sur une note semi-liée, lorsque votre code n'a pas besoin d'être thread-safe, il est préférable d'utiliser StringBuilder à la place de StringBuffer comme StringBuffer est synchronisé.

Questions connexes