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

How can I print .exe printf() messages from java program

本文关键字:printf exe 消息 打印 java 程序      更新时间:2023-10-16

我有一个应用程序,可以在控制台中从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应用程序如下:

public class MainClass {
public static void main(String[] args) {
    String str = "G:\Charan\Test\Debug\Test.exe";
    try {
        Process testProcess = Runtime.getRuntime().exec(str);
        InputStream inputStream = new BufferedInputStream(
                testProcess.getInputStream());
        int read = 0;
        byte[] bytes = new byte[1000];
        String text;
        while (read >= 0) {
            if (inputStream.available() > 0 ) {
                read = inputStream.read(bytes);
                if (read > 0) {
                    text = new String(bytes, 0, read);
                    System.out.println(text);
                }
            }
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}
}

可以按相反的顺序排列吗。如果我从控制台输入一些文本,Java应该读取该字符串并将其传递给.exe(或testProcess)。

有人能帮我吗?

假设您正试图从该进程逐行打印stdout,我会使用进程的输入流创建一个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的输出。

如果不刷新,则数据只存在于缓冲区中。在考虑性能时,这是一种权衡,即希望数据写入的频率与希望保存的写入/刷新操作的数量。如果性能至关重要,您可以考虑寻找一种更高效的进程间通信机制,在进程之间传递数据,而不是stdout。由于您使用的是Windows,第一步可能是查看Microsoft IPC帮助页。

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

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