如何使用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
相关产品推荐
相关产品推荐

