首页 > 解决方案 > 从 Linux 中用 Java 读取标准输出不起作用

问题描述

我正在尝试stdout从我的简单 Linux shellscript 中读取。

test.sh

#!/bin/bash
echo "I am waiting"
sleep 2s
exit 0 

ShellScriptExecutorTest.java好像:

import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

public class ShellScriptExecutorTest {

    public static void main(String[] args) {
        try {
            ProcessBuilder processBuilder = new ProcessBuilder("sudo", "bash", "./test.sh");
            processBuilder.directory(new File("/home/"));
            processBuilder.inheritIO();
            Process process = processBuilder.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);  
            }  
            
            int exitValue = process.waitFor();
            System.err.println("exitValue: " + exitValue);

        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

如果我执行上面的代码,我会得到:

[root@localhost home]# javac ShellScriptExecutorTest.java
[root@localhost home]# java ShellScriptExecutorTest
I am waiting
exitValue: 0

所以,显然它BufferedReader没有“读”任何东西,否则它写了:

--> I am waiting

在控制台上。

我怎样才能找出我的错误?

标签: javalinuxstdout

解决方案


删除此行

processBuilder.inheritIO();

查看它的作用:

public ProcessBuilder inheritIO()
Sets the source and destination for subprocess standard I/O to be the same as those of the current Java process.

取自这里java api

这正是您在控制台上看到的。您的子进程的控制台输出被“路由”到您的进程。

我不确定你想看什么?但是听起来您想查看子进程的 INPUT 吗?

底线是您需要对子进程和流有更基本的了解。


推荐阅读