Java ProcessBuilder EXE文件未正确获取输入流
Java ProcessBuilder EXE file not getting inputstream correctly
嗨,我为c++程序构建了一个Java GUI,我有点拘泥于调用我的exe文件的ProcessBuilder。
我用C++制作了这个小程序,只是为了测试ProcessBuilder,看看我是否可以控制I/O流:
#include <cstdlib>
#include<stdio.h>
int main(int argc, char** argv) {
int testInteger;
int a = 1;
while (a==1){
printf("Enter an integer: ");
scanf("%d",&testInteger);
if (testInteger == 0){
printf("Quitting program!");
return 0;
}else{
printf("You entered the number = %dn",testInteger);
}
}
return 0;
}
我的Java代码如下:
public static void main(String[] args) throws InterruptedException, IOException{
ProcessBuilder pb = new ProcessBuilder("./i_o_test");
Process process = pb.start();
InputStream is = process.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String line;
while ((line=br.readLine()) != null){
System.out.println(line);
}
}
该代码不会提示任何错误,只是挂起while循环。它不打印任何内容。这段代码与"echo"之类的命令配合得很好,所以我不知道我在这里做错了什么。
(如果你们有一个更好的建议,可以从ProcessBuilder以外的Java中控制c++exe进程中的i/o流,我会洗耳恭听)
提前感谢,Maarc~
BufferedReader#readLine()
阻塞,直到一个完整的行可用,通过接收换行符来指示。
您的C++代码打印一个提示,但没有换行符。这会导致readLine()
不返回,从而导致您所看到的行为。如果你想让Java和C++代码进行交互,你必须定义一个"协议",以便在消息完成并准备好执行时进行通信。这可以像换行一样简单,如果你的需求不同,也可以更复杂。这真的取决于你,但如果你正在处理一些现有的C++程序,并想从Java控制它,你必须做好处理它的准备
例如,如果C++程序在没有换行的情况下提示,并且您无法更改,则可能需要在提示字符串的末尾查找冒号:
。这意味着Java代码不能使用readLine()
,并且必须一次处理一个字符的输入。
相关文章:
- 如何从用户那里获取输入并将其存储在向量中?
- 如何忽略输入流中的某些字符?
- 代码在执行之前终止,并且没有从用户那里获取输入
- 从用户获取输入/输出
- C++输入流.与 cin unget() 函数有点混淆
- 从输入流中读取行,并能够跳过块
- TFLite 隔离错误,通过获取C++输入和输出
- 使用 Visual Studio 代码读取 C++ 中的输入流时出错
- 如何使 std::istream 从键盘获取输入(如 std::cin)?
- 使用 qt 或 c++ 从桌面获取输入和输出
- 您如何在C++中不断获取输入?
- 从源代码本身C++获取输入
- 函数,从问题中获取输入,并在主函数中使用该输入
- 当我们声明 cin 为 int 并从 cin 中获取输入并在 cout 中打印 cin 时会发生什么?
- 处理输入流运算符>>中的无效输入
- 如何在 std::map 中从 std::vector of std::p air 中获取输入?
- 树莓派上的端口音频,找不到输入流的设备
- 从输入流中获取下一个字符而无需存储
- Java ProcessBuilder EXE文件未正确获取输入流
- 通过输入流获取输入并将其存储在结构变量中