在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();
});
您应该在单独的线程中编写进程输入流,这样就不会死锁。
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();