gpt4 book ai didi

java - 如何从进程输入流中读取不立即可用的数据

转载 作者:行者123 更新时间:2023-12-02 12:07:19 26 4
gpt4 key购买 nike

在 Java 中,如果数据立即可用,则可以从 Process 的 inputStream 中读取数据。但是当进程不会立即产生数据时,似乎无法检索数据?!

单元测试:

@Test
public void testForkingProcess() throws Exception {
String [] cmds = new String[]{"echo this is a test", "sleep 2 ; echo this is a test"};
for(String cmd: cmds) {
Process p = Runtime.getRuntime().exec(cmd);
byte[] buf = new byte[100];
int len = 0;
long t0 = System.currentTimeMillis();
while(len < 15 && (System.currentTimeMillis() - t0) < 5000) {
int newLen = p.getInputStream().read(buf, len, buf.length - len);
if(newLen != -1) {
len += newLen;
}
}
long t1 = System.currentTimeMillis();
System.out.println("elapse time : " + (t1 - t0) +" ms");
System.out.println("read len : " + len);
p.destroy();
}
}

控制台输出:

    elapse time : 1 ms
read len : 15
elapse time : 5000 ms
read len : 0

是否有人知道此行为以及如何处理流以检索数据。

另一个简单的例子:

@Test
public void testMoreSimpleForkingProcess() throws Exception {
String [] cmds = new String[]{"echo this is a test", "sleep 2 ; echo this is a test"};
for(String cmd: cmds) {
Process p = Runtime.getRuntime().exec(cmd);
byte[] buf = new byte[100];
int len = 0;
int newLen = 0;
while(newLen >= 0) {
newLen = p.getInputStream().read(buf, len, buf.length - len);
if(newLen != -1) {
len += newLen;
}
}
p.getInputStream().close();
System.out.println("read len : " + len);
p.destroy();
}

}

控制台输出:

    read len : 15
read len : 0

最佳答案

How to read from Process inputStream not immediately available?

阻止。你不需要计时的东西。您不知道该过程产生输出的速度有多快。只需阻塞读取,然后重复直到流结束。

您还需要消耗错误流,并且还需要关闭进程的输入流。当已经收到流结束时,您也在 sleep 。毫无意义。

关于java - 如何从进程输入流中读取不立即可用的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46807127/

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