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

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();
}

注意:

  1. 本方案适用于Linux、macOS等类Unix系统,Windows系统需要替换为对应查询终端尺寸的命令。
  2. 如果你在IDEA、Eclipse等IDE的内置控制台运行代码,大概率拿不到有效结果,因为IDE内置控制台不是标准的交互式TTY,请在系统自带的终端/命令行工具中编译运行代码。

内容的提问来源于stack exchange,提问作者James Dougan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 20:36:08