Java: รอให้กระบวนการย่อยของกระบวนการเสร็จสิ้นก่อนที่จะอ่าน InputStream ของกระบวนการ

ฉันมีกระบวนการที่สร้างขึ้นดังนี้:

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

ในโปรแกรมของฉัน ฉันต้องการสร้างกระบวนการนี้เพียงครั้งเดียวเท่านั้น ฉันกำลังพัฒนาแอปพลิเคชัน root file explorer สำหรับ Android และเมื่อใดก็ตามที่กระบวนการนี้ถูกสร้างขึ้น อุปกรณ์ Android จะแจ้งให้ผู้ใช้ให้สิทธิ์การรูท นี่เป็นการดำเนินการที่ช้ามากและเนื่องจากเป็นไฟล์เบราว์เซอร์ จึงจำเป็นต้องได้รับสิทธิ์รูทบ่อยครั้ง ดังนั้นฉันจึงตัดสินใจสร้างกระบวนการนี้หนึ่งครั้งและเขียนคำสั่งไปยัง 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

ฉันจะแน่ใจได้อย่างไรว่าคำสั่งทำงานเสร็จแล้วก่อนที่จะอ่านกระบวนการ 'InputStream?


person josh798    schedule 28.01.2017    source แหล่งที่มา


คำตอบ (1)


ฉันยังพบปัญหาที่คล้ายกัน และฉันพบคำตอบที่นี่: รอจนกว่าคำสั่งใน su เสร็จสิ้น

หากคุณไม่ต้องการสตรีมการอ่านใดๆ ในกระบวนการเชลล์ เพียงเพิ่มสตรีมการอ่านเชลล์ก็อาจทำให้กระบวนการเชลล์เสร็จสิ้นได้

หรือใน XDA ก็มีวิธีที่ดีกว่า: [HowTo]Execute Root Commands and read output< /ก>

person Nathaniel Chen    schedule 28.02.2017