You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java调用Node进程交互时无法读取输出的问题解决

解决Java调用Node进程输入输出阻塞问题

问题现象

使用Java的ProcessBuilder调用Node.js进程,向其写入输入后,Java程序陷入阻塞,既无法读取Node的输出,也无法等待进程结束。

问题原因

  1. Node.js的readline.question()需要读取到换行符才会触发回调函数,原Java代码仅写入字符串hello,未添加换行,导致Node进程一直等待输入完成。
  2. Java端的reader.readLine()会持续阻塞,直到Node进程关闭标准输出流;而Node进程因未触发回调,既不会输出内容,也不会退出,形成死锁。

解决步骤

调整Java代码

  • 写入输入时添加换行符,触发Node的readline.question()回调
  • 写完输入后及时关闭输出流,明确告知Node进程输入已结束

修改后的Java代码:

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()));

    // 添加换行符,触发Node的question回调
    writer.write("hello\n");
    writer.flush();
    // 关闭输出流,告知Node输入已完成
    writer.close();

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

    reader.close();

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

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

Node.js代码确认

原Node代码逻辑无需修改,可额外添加close事件监听确保进程正常退出:

const readline = require('readline');

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

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

// 可选:监听close事件,确保进程退出
rl.on('close', () => {
  process.exit(0);
});

原理说明

  • 换行符是readline模块识别单条输入结束的标志,添加后Node会立即处理输入并执行回调。
  • 关闭Java端的输出流,相当于向Node进程的stdin发送EOF信号,避免Node持续等待更多输入。
  • Node进程执行完回调并关闭readline接口后,会输出内容并退出,此时Java端的readLine()会读取到输出,直到流关闭,最终完成进程等待。

内容的提问来源于stack exchange,提问作者justnuka

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 14:18:33