Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.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程序打印.exe printf()消息_Java_C++ - Fatal编程技术网

如何从java程序打印.exe printf()消息

如何从java程序打印.exe printf()消息,java,c++,Java,C++,我有一个应用程序可以在控制台中打印来自Test.exe的消息。我的java程序通过执行这个Test.exe创建一个进程。 此应用程序通过读取该进程的输入流来打印消息 我面临的问题是, 我有两种情况: 1) 当我双击test.exe时,消息(“打印:%d”)每秒打印一次。 2) 但是,当我运行java应用程序时,在终止Test.exe之前,所有消息最后都会打印出来(不是每秒钟打印一次)。如果.exe有非常大的消息要打印,那么它会打印这些消息(我想每当缓冲区满了时),并进行刷新。 但如何打印与第一

我有一个应用程序可以在控制台中打印来自Test.exe的消息。我的java程序通过执行这个Test.exe创建一个进程。 此应用程序通过读取该进程的输入流来打印消息

我面临的问题是,
我有两种情况:
1) 当我双击test.exe时,消息(“打印:%d”)每秒打印一次。
2) 但是,当我运行java应用程序时,在终止Test.exe之前,所有消息最后都会打印出来(不是每秒钟打印一次)。
如果.exe有非常大的消息要打印,那么它会打印这些消息(我想每当缓冲区满了时),并进行刷新。
但如何打印与第一种情况相同的消息

任何人的帮助都将不胜感激。:)

这是这个Test.exe的代码

#include <stdio.h>
#include <windows.h>
void main(void)
 {
  int i=0;

  while (1)
     {  
    Sleep(500);
    printf("\nPrinting : %d",i);
    i++;
       if (i==10)
      //if(i==100)
        {
        return 0;
        }
     }
}
如果我从控制台输入一些文本,Java应该读取该字符串并将其传递给.exe(或testProcess)。exe如何从Java程序扫描某些内容


谁能帮帮我吗?

似乎与不脸红有关。我猜这是两面的——您使用的C库似乎只有在写入终端时才会自动刷新输出。调用printf后手动刷新


在Java端,尝试从非缓冲流读取数据。

似乎与不刷新有关。我猜这是两面的——您使用的C库似乎只有在写入终端时才会自动刷新输出。调用printf后手动刷新


在Java方面,尝试从非缓冲流中读取数据。

鉴于您正试图逐行打印来自该进程的标准输出,我将使用进程的输入流创建一个BufferedReader对象,并在该对象上使用readLine()方法。可以使用以下构造函数链获取BufferedReader对象:

BufferedReader testProcessReader = new BufferedReader(new InputStreamReader(testProcess.getInputStream()));
并逐行阅读:

String line;
while ((line = testProcessReader.readLine()) != null) {
    System.out.println(line);
}
这里的假设是Test.exe正在刷新其输出,这是从Java端读取所必需的。您可以在每次调用printf()后通过调用fflush(stdout)刷新C的输出


如果不刷新,则数据仅存在于缓冲区中。在考虑性能时,需要权衡希望写入数据的频率与希望保存的写入/刷新操作的数量。如果性能很重要,您可以考虑寻找一种更有效的进程间通信机制,以便在进程之间传递数据而不是STDUT。由于您在Windows上,第一步可能是查看。

鉴于您正试图逐行打印来自该进程的标准输出,我将使用进程的输入流创建一个BufferedReader对象,并在该对象上使用readLine()方法。可以使用以下构造函数链获取BufferedReader对象:

BufferedReader testProcessReader = new BufferedReader(new InputStreamReader(testProcess.getInputStream()));
并逐行阅读:

String line;
while ((line = testProcessReader.readLine()) != null) {
    System.out.println(line);
}
这里的假设是Test.exe正在刷新其输出,这是从Java端读取所必需的。您可以在每次调用printf()后通过调用fflush(stdout)刷新C的输出


如果不刷新,则数据仅存在于缓冲区中。在考虑性能时,需要权衡希望写入数据的频率与希望保存的写入/刷新操作的数量。如果性能很重要,您可以考虑寻找一种更有效的进程间通信机制,以便在进程之间传递数据而不是STDUT。因为您在Windows上,第一步可能是查看.< /p>尝试添加C++应用程序>代码> FFLUHUP(STDUT)< /C> >在每个打印程序添加C++应用程序>代码> FFLUH(STDUT)之后,即使在PrtffNo更改之后,即使移到BuffRead读取器……无论如何,非常感谢……我将用FrHuSE()来检查My.exe非常频繁地打印消息。因此每次刷新都可能导致性能问题。是否有其他方法可以解决此问题。?如果不刷新,数据只存在于缓冲区中。这是一种权衡,即您希望数据写入的频率与您希望保存的写入/刷新操作的数量。您可以考虑寻找一种更有效的进程间通信机制,以便在进程之间传递数据而不是STDUT,但是该解决方案将是依赖于平台的。>高效的进程间通信机制,以便在进程之间传递数据而不是STDUT。你能详细解释一下吗?假设你在Windows上,看看。请注意,任何其他IPC机制都比您当前所做的要复杂得多。即使在切换到BufferedReader之后也没有任何更改。无论如何,非常感谢您…我将使用flush()检查。My.exe会频繁打印消息。因此每次刷新都可能导致性能问题。是否有其他方法可以解决此问题。?如果您不刷新,数据只存在于缓冲区中。这是一种权衡,即您希望数据写入的频率与您希望保存的写入/刷新操作的数量。您可以考虑寻找一种更有效的进程间通信机制,以便在进程之间传递数据而不是STDUT,但是该解决方案将是依赖于平台的。>高效的进程间通信机制,以便在进程之间传递数据而不是STDUT。你能详细解释一下吗?假设你在Windows上,看看。请注意,任何其他IPC机制都将比您当前所做的要复杂得多。很抱歉再次打断。。当我每次刷新时,我们的应用程序会出现性能问题。因为我意识到我们的.exe非常频繁地打印消息。因此每次刷新都可能导致性能问题。是否有其他方法?只有在刷新后,java应用程序才会看到输出。一个折衷办法是不在每次打印后刷新。这完全取决于你的软件应该如何工作。也许您将不得不考虑其他进程间通信的选择,正如评论中已经指出的那样。