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