Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 实时读取Runtime.getRuntime().exec()_Java_Android - Fatal编程技术网

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
如果要使用stdout.read(),函数将等待4096*n字节或getevent关闭

我如何读取实时数据,而不是等到4096字节被拨号

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代码中没有任何内容…没有注释。。。