如何毫不延迟地读取Java InputStream? 我有C++程序(Posier-exe),打印一些数据: printf("%s\n", line);
它平均每秒产生20-30行,但并不均匀 我想通过从Java代码运行exe在Java程序中捕获此数据:如何毫不延迟地读取Java InputStream? 我有C++程序(Posier-exe),打印一些数据: printf("%s\n", line);,java,inputstream,stdout,Java,Inputstream,Stdout,它平均每秒产生20-30行,但并不均匀 我想通过从Java代码运行exe在Java程序中捕获此数据: package temp_read; import java.io.*; public class Main { public static void main(String[] args) throws Throwable { Process p = Runtime.getRuntime().exec("d:/feeder.exe"); Inp
package temp_read;
import java.io.*;
public class Main {
public static void main(String[] args) throws Throwable {
Process p = Runtime.getRuntime().exec("d:/feeder.exe");
InputStream is = p.getInputStream();
BufferedReader in = new BufferedReader(new InputStreamReader(is));
String line = null;
while ((line = in.readLine()) != null) {
System.out.println(System.currentTimeMillis() + "," + line);
}
}
}
但当我查看输出时,我发现它每3-5秒接收一次大量字符串
问题:当feeder.exe打印到stdout时,如何立即无延迟地从feeder.exe接收数据
PS:无关的问题:如果停止用java(C++),java,.p/>< p>如果重定向,STDUT可能是缓冲的,这意味着问题是在C++代码中,而不是在Java端。当缓冲区满时,C++进程将缓冲输出并立即刷新几个“Prtff”。
如果你能够修改C++软件,尝试做一个<代码> FFLUW(STDUT);<代码>打印输出后,强制输出缓冲区刷新。
如果重定向,STDUT可能缓冲,这意味着问题在C++代码中,而不是java端。当缓冲区满时,C++进程将缓冲输出并立即刷新几个“Prtff”。
如果你能够修改C++软件,尝试做一个<代码> FFLUW(STDUT);<在printf之后使用code>强制刷新输出缓冲区。
最可能的原因是feeder.exe没有定期刷新其输出流,并且数据一直保存在其输出缓冲区中,直到缓冲区填满并写入
如果这是原因,那么在Java方面您无法避免这种情况。只有通过修改进料器
应用程序才能解决此问题
请注意,如果数据位于连接两个进程的“管道”中,那么在Java端读取就会得到它。假设行尾已写入管道,readLine()
调用将在不阻塞的情况下传递该行。最可能的原因是feeder.exe
没有定期刷新其输出流,并且数据位于其输出缓冲区中,直到缓冲区填满并作为结果写入
如果这是原因,那么在Java方面您无法避免这种情况。只有通过修改进料器
应用程序才能解决此问题
请注意,如果数据位于连接两个进程的“管道”中,那么在Java端读取就会得到它。假设已将行尾写入管道,则readLine()
调用将在不阻塞的情况下传递行。尝试运行feeder.exe |更多
您可能会看到相同的行为。我怀疑缓冲区在管道中,不是因为Java如何读取它。不要在同一个问题中问不相关的问题。作为另一个问题提问。@PeterLawrey,我在Windows上运行它。@Serg我想从d:/feeder.exe
可以通过运行CMD
@PeterLawrey来使用MS-DOS提示符,我不知道Windows有更多
命令。无论如何,我试过了,但没有效果。但问题通过fflush(stdout)解决代码>。谢谢。尝试运行feeder.exe |更多
您可能会看到相同的行为。我怀疑缓冲区在管道中,不是因为Java如何读取它。不要在同一个问题中问不相关的问题。作为另一个问题提问。@PeterLawrey,我在Windows上运行它。@Serg我想从d:/feeder.exe
可以通过运行CMD
@PeterLawrey来使用MS-DOS提示符,我不知道Windows有更多
命令。无论如何,我试过了,但没有效果。但问题通过fflush(stdout)解决代码>。谢谢