Я видел, как кто-то жаловался на то, что Logcat выводит только последнюю строку. Я хотел бы задать резервный вопрос: как я могу создать это условие, которое выводит только последнюю строку?
Вот как я читаю журнал, запуская поток.
public class ReadLog implements Runnable{
private boolean running = true;
public void stop(){
running = false;
}
@Override
public void run() {
Process proc = null;
try {
//Runtime.getRuntime().exec("/system/bin/logcat -c");
proc = Runtime.getRuntime().exec("/system/bin/logcat ");
}catch(IOException e) {
e.printStackTrace();
}
if(proc != null){
BufferedReader reader = new BufferedReader(new InputStreamReader(proc.getInputStream()));
String line= null;
try {
while((line=reader.readLine())!=null && running){
if(line.contains("specific word")){
doSomething();//do something base on log
running = false;
}
}
}
catch (IOException e) {
e.printStackTrace();
}
finally{
proc.destroy();
}
}
}
}
Я хочу прочитать только самую новую строку. Проблема в том, что это вызовет doSomething(), даже если «конкретное слово» не находится в последней строке, если я не добавлю Runtime.getRuntime().exec("/system/bin/logcat -c");
строку для очистки журнала перед запуском.
Это правда, что я могу добавить еще один while((line=reader.readLine())!=null && running){}
, чтобы позволить BufferedReader перейти к последней строке перед запуском, но это может занять много времени и слишком поздно.
Я пробовал Runtime.getRuntime().exec("/system/bin/logcat | tail -n 1");
Но не повезло, что tail
не принимает стандартный ввод. Я прошу любую команду, которая быстро выводит последнюю строку stdout, как tail -n 1 FILE
.