Java:等待进程的子进程完成,然后读取进程';输入流

Java:等待进程的子进程完成,然后读取进程';输入流,java,android,inputstream,Java,Android,Inputstream,我创建了一个流程,如下所示: Process p = Runtime.getRuntime().exec(new String[]{"su"}); 在我的程序中,我只想创建这个过程一次。我正在为Android开发一个根文件浏览器应用程序,每当创建这个过程时,Android设备都会提示用户授予根权限。这是一个非常缓慢的操作,由于这是一个文件浏览器,它通常需要根权限。因此,我决定创建此进程一次,并以以下方式将命令写入其OutputStream(stdin是此OutputStream): 在读取命令

我创建了一个流程,如下所示:

Process p = Runtime.getRuntime().exec(new String[]{"su"});
在我的程序中,我只想创建这个过程一次。我正在为Android开发一个根文件浏览器应用程序,每当创建这个过程时,Android设备都会提示用户授予根权限。这是一个非常缓慢的操作,由于这是一个文件浏览器,它通常需要根权限。因此,我决定创建此进程一次,并以以下方式将命令写入其OutputStream(stdin是此OutputStream):

在读取命令输出之前,我需要我的程序等待
writeBytes
编写的命令终止。我尝试了
p.waitFor()
,但这会导致程序挂起

以下是我如何从InputStream读取字节:

stdin.writeBytes(command + "\n");
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;
    }
}
int读取;
串出“”;
stdout=p.getInputStream();
字节[]缓冲区=新字节[262144];
while(true){
read=stdout.read(缓冲区);
out+=新字符串(缓冲区,0,读取);
如果(读取
请注意,尽管
read(buffer)
方法在输入数据可用之前会阻塞,但在这种情况下它不会阻塞,因为它认为它已到达InputStream的末尾

我试图在本文中只包含我的代码的相关部分,但是如果您想查看包含这些内容的类的整个源代码,请参见此处:


在读取进程“InputStream”之前,如何确保命令已完成运行?

我也遇到了类似的问题,我在这里找到了答案:

如果在此shell进程中不需要任何读取流,只需添加shell读取流即可完成shell进程

或者在XDA中也有更好的方法:
我也遇到了类似的问题,我在这里找到了答案:

如果在此shell进程中不需要任何读取流,只需添加shell读取流即可完成shell进程

或者在XDA中也有更好的方法: