ฉันมีกระบวนการที่สร้างขึ้นดังนี้:
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?