У меня есть процесс, созданный следующим образом:
Process p = Runtime.getRuntime().exec(new String[]{"su"});
В моей программе я хочу создать этот процесс только один раз. Я разрабатываю приложение для просмотра корневых файлов для Android, и всякий раз, когда этот процесс создается, устройство Android будет предлагать пользователю предоставить права root. Это очень медленная операция, и, поскольку это файловый браузер, ему часто требуются права root. Итак, я решил создать этот процесс один раз и писать команды в его OutputStream следующим образом (stdin и есть этот OutputStream):
stdin.writeBytes(command + "\n");
Прежде чем я смогу прочитать вывод команды, мне нужно, чтобы моя программа дождалась завершения команды, написанной writeBytes
. Я пробовал p.waitFor()
, но это приводит к тому, что программа вешать.
Вот как я читаю байты из InputStream:
int read;
String out = "";
stdout = p.getInputStream();
byte[] buffer = new byte[262144];
while (true) {
read = stdout.read(buffer);
out += new String(buffer, 0, read);
if (read < BUFF_LEN) {
//we have read everything
break;
}
}
Обратите внимание, что хотя метод read(buffer)
блокируется до тех пор, пока не будут доступны входные данные, в этом случае он не блокируется, так как считает, что достиг конца InputStream.
Я попытался включить в этот пост только соответствующие части моего кода, но если вы хотите взглянуть на весь исходный код класса, в котором он содержится, см. здесь: http://pastebin.com/t6JdWmQr.
Как я могу убедиться, что команда завершила работу, прежде чем читать входной поток процесса?