gpt4 book ai didi

java - 实时读取 Runtime.getRuntime().exec()

转载 作者:行者123 更新时间:2023-11-30 11:35:04 26 4
gpt4 key购买 nike

程序的问题是实时运行的。
例如: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)));
}

我发现这在文档中得到了加强!

Copies the InputStream into the OutputStream, until the end of the stream has been reached. This method uses a buffer of 4096 kbyte.

>> Documentation

最佳答案

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

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


还应注意,available() 并未提供可靠信息。如果您仔细阅读 API 文档,您会发现 N 的返回值仅意味着同时尝试读取超过 N 个字节可能会被阻止。一个线程不能同时调用 available()read(),所以当你开始使用 available() 提供的信息时它可能已经过时了。

关于java - 实时读取 Runtime.getRuntime().exec(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15315670/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com