Java ProcessBuilder EXE文件未正确获取输入流

Java ProcessBuilder EXE file not getting inputstream correctly

本文关键字:获取 输入流 ProcessBuilder EXE 文件 Java      更新时间:2023-10-16

嗨,我为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(),并且必须一次处理一个字符的输入。