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

时间:2012-03-14 07:09:36

标签: java c++

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

我面临的问题是, 我有两种情况:
1)当我双击test.exe时,消息(“Printing:%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).How .exe从Java程序中扫描一些东西。

任何人都可以帮助我..

2 个答案:

答案 0 :(得分:1)

鉴于您尝试逐行从该进程打印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 help page

答案 1 :(得分:0)

似乎与不冲洗有关。我想这是双方的 - 你使用的C库似乎只在写入终端时自动刷新输出。调用printf后手动刷新。

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