Я перечисляю свой комментарий как ответ, поскольку это, очевидно, помогло решить вашу проблему, но здесь происходит еще кое-что, что я не в состоянии полностью решить:
Попробуйте также перенаправить stderrчтобы увидеть, есть ли какая-либо ошибка, которая затем может быть зафиксирована - я думаю, что это будет &> (это bash) - и> outfile 2> & 1 для более общего синтаксиса.
Итак
dos.writeBytes("logcat | grep --line-buffered \"search string\" &> /storage/emulated/0/logcat.log\n");
Или
dos.writeBytes("logcat | grep --line-buffered \"search string\" > /storage/emulated/0/logcat.log 2>&1\n");
Первоначально целью комментария было дать вам больше информации о том, что на самом деле происходит - как выяснилось, это помогло вам получить результат, который вымы ищем.
Я полагаю, что здесь есть несколько факторов, которые могут способствовать тому, почему добавление stderr помогло:
- stderr (который предложил добавить комментарий) не буферизован - я думаю (но не может доказать) не буферизация - это то, что помогает вам, даже несмотря на то, что перехваченный вывод является stdout.
- обработка stdout чувствительна к TTY (эмуляция терминала) против non-TTY (ваша программа) иразные подходы к буферизации (буферизация строк в TTY, в противном случае - полная буферизация).Я понимаю, что ваш вариант grep должен преодолеть это.Эта разница в TTY-nonTTY может объяснить источник вашей проблемы.
- Отправленный код отправляет команду (logcat ...) процессу, созданному , и продолжает .Так, например, если бы logcat должен был выводить много данных, теоретически ваш опубликованный код продолжил бы и оставил бы область действия - что происходит с процессом, созданным, когда
p
выходит из области видимости - не уверен.
В любом случае, рад, что вы смогли продолжить.