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

Java 20中Process.getInputStream为何丢失空格?

问题原因与解决方案

问题根源

你用readLine()读取子进程输出时,这个方法会自动移除每行末尾的换行符。而ls命令的默认输出逻辑是每个文件/目录单独占一行(每个条目后带换行符),当你用System.out.print(line)打印时,没有把丢掉的换行符补回去,所有条目就直接连在一起输出了。

解决方法

有两种简单的修复方式:

  • 改用System.out.println(line)打印:println会自动在每行末尾添加系统默认的换行符,完美还原原输出格式
    String line = null;
    var iStream = new BufferedReader(new InputStreamReader(process.getInputStream()));
    while ((line = iStream.readLine()) != null) {
        System.out.println(line);
    }
    
  • 若必须使用print,手动补回换行符(推荐用系统默认换行符,跨平台更友好):
    String line = null;
    var iStream = new BufferedReader(new InputStreamReader(process.getInputStream()));
    while ((line = iStream.readLine()) != null) {
        System.out.print(line + System.lineSeparator());
    }
    

为什么inheritIO能正常工作

ProcessBuilder.inheritIO()是让子进程直接复用父进程的标准IO流,子进程的输出会原封不动地传递到控制台,完全保留了原输出里的换行符,所以不会出现条目拼接的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 22:42:06