如何从java程序中打印.exe printf()消息
How can I print .exe printf() messages from java program
我有一个应用程序,可以在控制台中从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方面,请尝试从非缓冲流中读取。
- 为cl.exe(Visual Studio代码)指定命令行C++版本
- 终端不会为C++文件创建.exe文件吗
- 在Windows中以.exe的形式运行c++
- 为什么在C的循环中使用printf的Rust代码不显示输出,而在C++的循环中显示std::cout
- 内联程序集printf将整数解释为地址
- Visual Studio mkl_link_tool.exe链接错误
- 为什么mpfr_printf与十六进制浮点(%a转换说明符)的printf不同
- PrintWindow函数在notepad.exe中出错
- VSCode C++ 编译的exe感染了Win32:TrojanX-gen[Trj]
- C++ Setter/Getter,cout 工作,printf 失败
- 将返回值从 exe 传递到 bat,并将其传递给 C# 中的进程
- 获取当前正在运行的 exe 名称(不是路径)
- 从 exe 文件 (Visual Studio ) 启动时调试断言失败
- 1d.exe找不到SFML文件?
- VI工作室代码错误无法打开输出文件主.exe
- 如何为每个客户生成自定义 exe
- Printf 命令不打印时添加了查找常见除数的新代码
- 使用参数在 C# 的C++上运行.exe
- SIGSEGV, 分段错误. 而 printf() 数组索引的值
- 如何从java程序中打印.exe printf()消息