Java 实时读取Runtime.getRuntime().exec()
程序的问题是实时工作的。Java 实时读取Runtime.getRuntime().exec(),java,android,Java,Android,程序的问题是实时工作的。 例如:getevent 但是,当我试图读取来自进程的数据时,exec会给它们的部分至少4096字节 例如: 如果getevent返回1000字节的文本:stdout.available()==0 如果getevent返回4000字节的文本:stdout.available()==0 如果getevent返回4096字节的文本:stdout.available()==4096 如果getevent返回8192字节的文本:stdout.available()==8192
例如:getevent
但是,当我试图读取来自进程的数据时,exec会给它们的部分至少4096字节 例如:
- 如果getevent返回1000字节的文本:stdout.available()==0
- 如果getevent返回4000字节的文本:stdout.available()==0
- 如果getevent返回4096字节的文本:stdout.available()==4096
- 如果getevent返回8192字节的文本:stdout.available()==8192
- 如果getevent返回10000字节的文本:stdout.available()==8192
Process p = Runtime.getRuntime().exec(new String[]{"su", "-c", "system/bin/sh"});
DataOutputStream stdin = new DataOutputStream(p.getOutputStream());
stdin.writeBytes("getevent\n");
InputStream stdout = p.getInputStream();
byte[] buffer = new byte[1];
int read;
String out = new String();
while(true){
read = stdout.read(buffer);
out += new String(buffer, 0, read);
System.out.println("MYLOG: "+(new String(buffer, 0, read)));
}
我在文档中发现这一点
将InputStream复制到OutputStream,直到
小溪已经到达了。此方法使用4096 KB的缓冲区。
>最可能的原因是外部应用程序正在缓冲其输出。对于正在写入其“标准输出”的应用程序来说,这是非常典型的。解决方案是修改外部应用程序,使其在适当的时间“刷新”其输出 如果存在可读取的数据,Java代码中没有任何内容会导致延迟。特别是,使用DataOutputStream不会导致这种情况
还应注意,
available()
不能提供可靠的信息。如果仔细阅读API文档,您会发现返回值N
仅意味着同时尝试读取超过N个字节可能会阻塞。线程不能同时调用available()
和read()
,因此当您开始使用available()提供的信息时
它可能已经过时。的javadoc for指示您应该1)在两个线程上同时读取进程的stdout
和stderr
流,或者2)使用合并流。如果不这样做,进程可能会阻塞:“如果未读取这些流,目标进程可能会在等待缓冲区空间时阻塞。”
也许忽略stderr
会阻止您实时读取stdout
?在您的代码中,stdout
是一个InputStream
,它将从它的available()
-method。另外,您链接的这个类不是正式的,它使用4KB的缓冲区,您使用1B的缓冲区。@user113215已选中。没有帮助。4096*n字节…@LukasKnuth函数调用系统,而不是我。作为标准,它使用4K,我不知道如何更改它<代码>大多数客户端应使用BufferedInputStream包装其输入流。仅进行大容量读取的调用方可能会忽略缓冲。我看不出您在哪里使用了此方法。抛开这一点不谈,该方法使用了第三个参数和要使用的缓冲区的大小。最可能的原因是外部应用程序正在缓冲其输出。
终端模拟器工作得很好<代码>Java代码中没有任何内容…没有注释。。。