2012-09-10 3 views
1

Я пишу программу, которая в основном отправляет команду linux через java, а затем выводит результат. Он отлично работает, если выход - только одна строка, но для вывода нескольких строк я не могу понять, что я делаю неправильно. Например, чтобы проверить использование памяти, я использую команду «свободный», но он возвращает только строки 1 и 3. Вот мой код:Печать нескольких строк, возвращаемых BufferedReader

if (clinetChoice.equals("3")) 
    { 
     String command = "free"; 

     Process process = Runtime.getRuntime().exec(command); 

     BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())); 

     System.out.println("You Chose Option Three"); 

     String line;    

     while ((line = reader.readLine()) != null) 
     { 
      output += line; 
      System.out.println(line); 
      line = reader.readLine(); 
     } 

    } 

При запуске этого он возвращает только:

total used free share buffers cached 
-/+ buffers/cache: 6546546 65464645 

Код клиента:

while ((fromServer = input.readLine()) != null) 
    { 
     System.out.println("Server: " + fromServer);    
     if (fromServer.equals("Bye")) 
      break;   

     System.out.print("Enter your choice: "); 
     fromClient = stdIn.readLine().trim(); 

     if(fromClient.equals("1")) 
     { 
      System.out.println("Client: " + fromClient); 
      output.println(fromClient); 

     } 
     if(fromClient.equals("2")) 
     { 
      System.out.println("Client: " + fromClient); 
      output.println(fromClient); 

     } 
     if(fromClient.equals("3")) 
     { 
      System.out.println("Client: " + fromClient); 
      output.println(fromClient); 

     } 
     if(fromClient.equals("4")) 
     { 
      System.out.println("Client: " + fromClient); 
      output.println(fromClient); 
      break; 

     } 


    } 

ответ

6

Вы звоните readLine как в тесте петли и тела цикла. Поэтому для каждой итерации цикла readLine вызывается дважды, и один из результатов отбрасывается: он не печатается и не добавляется к output. Это соответствует результатам, которые вы описываете.

Этот цикл должен быть достаточно:

while ((line = reader.readLine()) != null) 
{ 
    output += line + System.getProperty("line.separator"); 
    System.out.println(line); 
} 

Если вы просто пытаетесь напечатать весь вывод один раз, и так как вы собираете выход в вашей output переменной, вы можете переместить println из цикл:

while ((line = reader.readLine()) != null) 
{ 
    output += line + System.getProperty("line.separator"); 
} 

System.out.println(output); 
+0

этот ответ правильный, просто нажмите кнопку 'line = reader.readLine();' в нижней части вашего цикла. – lynks

+0

Это работает, спасибо. Единственное, что он возвращает все на одной линии. Я добавил вывод + = line + "\ n"; но это печатает одну строку за раз, а не печатать все за один раз. – Nick

+0

@Nick: 'readLine' потребляет новую строку, поэтому вам нужно будет добавить ее обратно. Если вы хотите распечатать вывод все сразу, удалите 'println' в своем цикле и выполните' println (output) 'после цикла. Я добавлю это в ответ – pb2q

1

Просто используйте это ... Вы вызываете readLine() дважды ....

while ((line = reader.readLine()) != null) 
     { 

      System.out.println(line); 

     } 

Если вы хотите назначить данные для вывода varible..then сделать это внутри время цикла ..

output = output + line;

1

Я должен отметить, что в дополнение к комментариям повторно. используя readline() дважды, вы должны строго использовать stdout/stderr одновременно. В противном случае вы рискуете заблокировать выход процесса, так как не используете его. См. this SO answer для получения дополнительной информации.

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