Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.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 InputStream? 我有C++程序(Posier-exe),打印一些数据: printf("%s\n", line);_Java_Inputstream_Stdout - Fatal编程技术网

如何毫不延迟地读取Java InputStream? 我有C++程序(Posier-exe),打印一些数据: printf("%s\n", line);

如何毫不延迟地读取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

它平均每秒产生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");
        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)解决。谢谢