Java: Tunggu hingga subproses selesai sebelum membaca InputStream proses

Saya memiliki proses yang dibuat sebagai berikut:

Process p = Runtime.getRuntime().exec(new String[]{"su"});

Dalam program saya, saya hanya ingin membuat proses ini sekali. Saya sedang mengembangkan aplikasi penjelajah file root untuk Android, dan setiap kali proses ini dibuat, perangkat Android akan meminta pengguna untuk memberikan izin root. Ini adalah operasi yang sangat lambat, dan karena ini adalah peramban file, maka akan sering memerlukan izin root. Jadi, saya telah memutuskan untuk membuat proses ini sekali dan menulis perintah ke OutputStream dengan cara berikut (stdin adalah OutputStream ini):

stdin.writeBytes(command + "\n");

Sebelum saya dapat membaca output dari perintah, saya perlu program saya menunggu hingga perintah yang ditulis oleh writeBytes telah dihentikan. Saya telah mencoba p.waitFor(), namun hal ini menyebabkan program tersebut berhenti bekerja. menggantung.

Inilah cara saya membaca byte dari 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;
    }
}

Perhatikan bahwa meskipun metode read(buffer) memblokir hingga data masukan tersedia, metode ini tidak memblokir dalam kasus ini karena dianggap telah mencapai akhir InputStream.

Saya telah mencoba untuk memasukkan hanya bagian yang relevan dari kode saya dalam posting ini, tetapi jika Anda ingin melihat seluruh kode sumber dari kelas di mana ini terkandung, lihat di sini: http://pastebin.com/t6JdWmQr.

Bagaimana saya bisa memastikan perintah telah selesai dijalankan sebelum membaca proses InputStream?


person josh798    schedule 28.01.2017    source sumber


Jawaban (1)


Saya juga mengalami masalah serupa, dan saya menemukan jawabannya di sini: Tunggu hingga ada perintah di su selesai

Jika Anda tidak memerlukan aliran baca apa pun dalam proses shell ini, cukup tambahkan aliran baca shell yang dapat menyelesaikan proses shell.

Atau di XDA juga ada cara yang lebih baik: [HowTo]Jalankan Perintah Root dan baca hasilnya

person Nathaniel Chen    schedule 28.02.2017