使用InputStream/OutputStream与Java子进程交互时无法读取回显结果
解决Java子进程回显内容无法读取的问题
我来帮你拆解下问题所在,然后给出修复方案:
问题根源分析
- 单次读取后终止循环:你第一次读取进程输出时,读完第一行就用
break跳出了循环,导致后续进程输出的回显内容完全没机会被读取。 - 错误的输入写入方式:
os.write(i)是直接写入整数对应的ASCII字节值(比如输入123,实际写入的是ASCII码为123的{字符),子进程的输入逻辑根本识别不了这个内容,自然不会触发回显输出。 - 缺少输入结束标识:子进程的
Scanner.nextInt()需要读取到换行符才会确认输入完成,你没写入换行的话,子进程会一直卡在等待输入的状态。
修改后的完整代码
import java.io.*; import java.util.Scanner; public class ProcessTest { public static void main(String[] args) throws IOException { String command[] = {"java", "-cp", "C:\\Users\\Mahika\\Documents\\NetBeansProjects\\JavaTest\\compilerTest", "InputInteger"}; ProcessBuilder pb = new ProcessBuilder(command); Process p = pb.start(); System.out.println("Process started"); // 单独开线程读取子进程输出,避免主线程阻塞 new Thread(() -> { try (BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()))) { String output; // 持续读取直到输出流关闭 while ((output = br.readLine()) != null) { System.out.println(output); } } catch (IOException e) { e.printStackTrace(); } }).start(); // 读取用户输入并正确写入子进程 Scanner sc = new Scanner(System.in); int i = sc.nextInt(); PrintStream ps = new PrintStream(p.getOutputStream()); ps.println(i); // 自动转换为字符串并添加换行符,适配子进程的输入逻辑 ps.flush(); // 等待子进程处理完成并退出 try { p.waitFor(); } catch (InterruptedException e) { e.printStackTrace(); } } }
核心修复点说明
- 异步读取输出:子进程的输出是异步产生的,单独开线程读取可以避免主线程因等待输入而阻塞,保证所有输出(包括回显)都能被捕获。
- 保持读取循环:移除
break语句,让读取循环持续运行到子进程输出流关闭,这样就能拿到所有输出内容。 - 正确写入输入:使用
PrintStream.println()方法,它会自动把整数转换成字符串并添加换行符,子进程的Scanner能正确识别输入,进而触发回显逻辑。 - 等待子进程结束:调用
waitFor()确保主线程不会提前退出,能等到子进程处理完输入并输出回显。
内容的提问来源于stack exchange,提问作者Mahi_25
相关产品推荐
相关产品推荐

