2

该程序的问题是实时工作的。
例如: 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 kbyte 的缓冲区。

>>文档

4

1 回答 1

1

最可能的原因是外部应用程序正在缓冲其输出。这对于正在写入其“标准输出”的应用程序来说是非常典型的。解决方案是修改外部应用程序,使其在适当的时间“刷新”其输出。

如果有可供读取的数据,Java 代码中没有任何内容会导致延迟。特别是,使用 DataOutputStream 不会导致这种情况。


还应该指出的是available(),没有给出可靠的信息。如果您仔细阅读 API 文档,您会发现返回值Nonly 意味着同时尝试读取 N 个以上字节可能会阻塞。一个线程不能同时调用两者available()read()所以当你开始使用它提供的信息时,available()它可能已经过时了。

于 2013-03-10T00:57:25.333 回答