Java调用Node进程交互时无法读取输出的问题解决
解决Java调用Node进程输入输出阻塞问题
问题现象
使用Java的ProcessBuilder调用Node.js进程,向其写入输入后,Java程序陷入阻塞,既无法读取Node的输出,也无法等待进程结束。
问题原因
- Node.js的
readline.question()需要读取到换行符才会触发回调函数,原Java代码仅写入字符串hello,未添加换行,导致Node进程一直等待输入完成。 - 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
相关产品推荐
相关产品推荐

