Java如何获取系统命令执行输出?以stty size获取终端尺寸为例
问题原因
stty size命令默认会查询标准输入关联的终端(TTY)参数,而通过ProcessBuilder启动的子进程的标准输入默认是匿名管道,不是终端设备,因此stty执行失败,错误信息输出到标准错误流,你现有代码仅读取标准输出流,自然拿不到有效结果。- 你提到的
[I@6ce253f1输出和这段代码无关,这是Java中int数组调用默认toString()方法的返回值,排查其他位置的打印代码即可。
解决方案
直接给stty命令添加参数指定查询当前程序的控制终端/dev/tty,不需要调整进程IO继承规则,即可正常读取输出结果,修改后的代码如下:
ProcessBuilder processBuilder = new ProcessBuilder(); // 指定stty查询当前控制终端/dev/tty的尺寸 processBuilder.command("stty", "-F", "/dev/tty", "size"); try { Process process = processBuilder.start(); // 等待命令执行完成,避免提前读取输出 process.waitFor(); try (InputStreamReader is = new InputStreamReader(process.getInputStream(), "UTF-8"); BufferedReader reader = new BufferedReader(is)) { String line = reader.readLine(); if (line != null) { String[] parts = line.trim().split("\\s+"); int rows = Integer.parseInt(parts[0]); int cols = Integer.parseInt(parts[1]); System.out.println("终端行数:" + rows + ",终端列数:" + cols); } } } catch (IOException | InterruptedException e) { e.printStackTrace(); }
注意:
- 本方案适用于Linux、macOS等类Unix系统,Windows系统需要替换为对应查询终端尺寸的命令。
- 如果你在IDEA、Eclipse等IDE的内置控制台运行代码,大概率拿不到有效结果,因为IDE内置控制台不是标准的交互式TTY,请在系统自带的终端/命令行工具中编译运行代码。
内容的提问来源于stack exchange,提问作者James Dougan
相关产品推荐
相关产品推荐

