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
相关产品推荐
相关产品推荐

