我有一个应用程序在控制台中打印来自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程序中扫描一些东西。
任何人都可以帮助我..
答案 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端,尝试从非缓冲流中读取。