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

如何使用Java捕获并打印命令行执行的输出内容

问题根因
  • 原执行命令携带start cmd.exe /k参数,会启动独立的新命令提示符窗口,新窗口的输出不会绑定到当前Java程序创建的进程IO流,程序无法读取到新窗口的输出内容
  • java -version命令的版本信息默认输出到标准错误流(stderr),而非普通的标准输出流(stdout),原代码仅读取了标准输出流,无法获取到版本内容
修正后实现代码
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Test {
    public static void main(String[] args) throws IOException {
        // 构建进程,直接执行java -version,不额外启动新cmd窗口
        ProcessBuilder processBuilder = new ProcessBuilder("cmd.exe", "/c", "java", "-version");
        // 将标准错误流重定向到标准输出流,统一读取内容
        processBuilder.redirectErrorStream(true);
        Process process = processBuilder.start();

        // 读取进程输出内容
        System.out.println("Java版本信息:");
        try (BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()))) {
            String line;
            while ((line = reader.readLine()) != null) {
                System.out.println(line);
            }
        }

        // 等待进程执行完成,回收资源
        try {
            process.waitFor();
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        }
    }
}
补充简化方案

如果仅需要获取当前运行程序的JDK版本,无需拉起外部进程,直接读取JDK内置系统属性即可,性能更高也不会出现IO读取异常:

public class Test {
    public static void main(String[] args) {
        // 获取Java版本号
        String javaVersion = System.getProperty("java.version");
        // 获取Java运行时完整版本信息
        String runtimeVersion = System.getProperty("java.runtime.version");
        System.out.println("当前Java版本:" + javaVersion);
        System.out.println("Java运行时完整版本:" + runtimeVersion);
    }
}
关键注意点
  • 不要在执行命令时加start参数拉起新窗口,否则进程IO会和当前程序断开
  • 调用外部命令时要注意区分输出流类型,部分命令的提示、版本信息会走标准错误流,可通过redirectErrorStream(true)合并流简化读取逻辑
  • 流资源建议用try-with-resources语法自动关闭,避免资源泄漏

内容的提问来源于stack exchange,提问作者jitendra kumar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 10:01:28