Java: подождите, пока подпроцесс процесса завершится, прежде чем читать процесс InputStream

У меня есть процесс, созданный следующим образом:

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.

Как я могу убедиться, что команда завершила работу, прежде чем читать входной поток процесса?


person josh798    schedule 28.01.2017    source источник


Ответы (1)


Я также сталкиваюсь с подобной проблемой и нашел ответ здесь: Подождите, пока команда в Су заканчивает

Если вам не нужен какой-либо поток чтения в этом процессе оболочки, просто добавьте поток чтения оболочки, чтобы завершить процесс оболочки.

Или в XDA также есть лучший способ: [HowTo]Выполнение корневых команд и чтение вывода< /а>

person Nathaniel Chen    schedule 28.02.2017