在Java中获取进程的输出流

问题描述 投票:0回答:1

在java中,我需要在这种情况下运行一个进程节点并以编程方式提供用户输入。我可以这样读取它的输出: `。字符串路径=“/Users/tolymbeknurtai/desktop/projects/servlets/src/main/java/server/tester/tests/example.js”;

        String[] command = {"node", path};

        ProcessBuilder processBuilder = new ProcessBuilder(command);
        Process process = processBuilder.start();

        BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));

        String line;
        while ((line = reader.readLine()) != null) {
            System.out.println(line);
        }

        reader.close();

        int exitCode = process.waitFor();
        System.out.println("process exited with code " + exitCode);` 

一旦我尝试访问输出流并向其写入内容,我什至无法读取程序的输出。当我运行代码时,我没有完成执行。显然输出流无法写入。

        try {
            String path = "/Users/tolymbeknurtai/desktop/projects/servlets/src/main/java/server/tester/tests/example.js";

            String[] command = {"node", path};

            ProcessBuilder processBuilder = new ProcessBuilder(command);
            Process process = processBuilder.start();

            BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(process.getOutputStream()));
            BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));

            writer.write("hello");
            writer.flush();

            String line;
            while ((line = reader.readLine()) != null) {
                System.out.println(line);
            }

            writer.close();
            reader.close();

            int exitCode = process.waitFor();
            System.out.println("Node.js process exited with code " + exitCode);

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

我该如何解决这个问题?发现有人使用这个,但就我而言,它不起作用。 example.js 中的 javascript 代码:

const readline = require('readline');

const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout
});

rl.question('',(input) => {
  console.log(input);

  rl.close();
});

java outputstream
1个回答
0
投票

您应该在单独的线程中编写进程输入流,这样就不会死锁。

            ProcessBuilder processBuilder = new ProcessBuilder(command);
            Process process = processBuilder.start();

            new Thread(() -> {
                try (BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(process.getOutputStream()))) {
                    writer.write("hello");
                    writer.flush();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }).start();

            BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
            String line;
            while ((line = reader.readLine()) != null) {
                System.out.println(line);
            }
            reader.close();
© www.soinside.com 2019 - 2024. All rights reserved.