Java 运行时进程无法在 运行 一组命令后退出并等待其输出

Java Runtime process was unable to exit after running a set of commands and wait for its output

一旦我们从该方法中发出 运行 命令,就无法退出该方法。它卡在 StreamHandler class.

的波纹管代码中
 while (bufferedReader.read(cb) > 0) {
        cb.flip();
        char[] chars = new char[cb.limit()];
        cb.get(chars);
        System.out.println(new String(chars));
        cb.clear();
 }

有什么解决方法可以解决这个问题?我使用此方法来执行 运行 组 windows cmd 命令并等待它们执行。我不想看到执行命令的输出。但是我有一个要求,等到所有的命令都执行完,退出这个方法再执行别的。

public synchronized execute_cmd_command(List<String> commandLst) throws IOException, InterruptedException {

            Process[] process = {null};

            process[0] = Runtime.getRuntime().exec("cmd.exe");
            BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(process[0].getOutputStream()));

            commandLst.stream().forEach(s -> {
                try {
                    bufferedWriter.write(s);
                    bufferedWriter.newLine();
                    bufferedWriter.flush();
                } catch (IOException e) {
                    System.out.println(e.getMessage());
                    e.printStackTrace();
                    throw new RuntimeException(e);
                }
            });

            StreamHandler streamHandler = new StreamHandler(process[0].getInputStream());
            streamHandler.start();
            streamHandler.join();

        }

流处理程序Class

public class StreamHandler implements Runnable {

    private InputStream inputStream;
    Thread thread;


    public StreamHandler(InputStream inputStream) {
        this.inputStream = inputStream;
    }

    public void start() {
        thread = new Thread(this);
        thread.start();
    }

    public void join() throws InterruptedException {
        thread.join();
    }


    @Override
    public void run() {

        try {

            CharBuffer cb = CharBuffer.allocate(256);
            InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
            BufferedReader bufferedReader = new BufferedReader(inputStreamReader);

            cb.clear();
            while (bufferedReader.read(cb) > 0) {
                cb.flip();
                char[] chars = new char[cb.limit()];
                cb.get(chars);
                System.out.println(new String(chars));
                cb.clear();
            }

        } catch (Exception ex) {
            ex.printStackTrace();
            throw new RuntimeException(ex);
        }
    }

}

进程的输出挂在“StreamHandler”class 的“bufferedReader.read(cb) > 0”行,之后不返回任何内容。 你们能提供一个解决方法吗?

您应该在启动 StreamHandler 线程之前关闭进程[0].getOutputStream()(另外,最好关闭 bufferedWriter):

bufferedWriter.close();
process[0].getOutputStream().close();

bufferedReader.read(cb) 将阻塞直到某些输入可用、发生 I/O 错误或到达流的末尾。

https://docs.oracle.com/javase/7/docs/api/java/io/Reader.html#read(char[])

由于 process[0].getOutputStream() 通过管道传输到进程的输入流,您应该关闭 OutputStream 否则 bufferedReader.read(cb) 将被阻塞。