如何使用 bash 将输入通过管道传送到 Java 程序

2022-09-01 17:45:30

我的 Java 程序正在侦听标准输入:

InputStreamReader isReader = new InputStreamReader(System.in);
BufferedReader bufReader = new BufferedReader(isReader);
while(true){
    try {
        String inputStr = null;
        if((inputStr=bufReader.readLine()) != null) {
            ...
        }
        else {
            System.out.println("inputStr is null");
        }
    }
    catch (Exception e) {
        ...
    }
}

现在,我想从 bash 管道输入到这个程序。我尝试了以下方法:

echo "hi" | java -classpath ../src test.TestProgram

但它只是无限次打印。我做错了什么?inputStr is null

编辑1:更新了问题以包含更多代码/上下文。


编辑 2:

看起来我遇到了与此OP相同的问题:Java中的命令行管道输入

如何修复程序,以便我可以通过管道输入进行测试,但正常运行程序将允许用户在标准输入上输入输入?


答案 1

你有,所以无限循环是你要得到的。while(true)

在循环中的某个位置添加一个是修复它的一种方法。但这不是一个好的风格,因为读者必须四处寻找,以确定它是否以及何时退出。break

最好让你的陈述清楚地显示退出条件是什么:while

String inputStr = "";
while(inputStr != null) {
    inputStr=bufReader.readLine(); 
    if(inputStr != null) {
        ...
    } else {
        System.out.println("inputStr is null");
    }
}

答案 2

修复了它。输入的管道完成后,不断返回,所以无限循环继续循环。readLine()null

解决方法是在返回 null 时从无限循环中断。readLine()


推荐