首页 > 其他分享 >ProcessBuilder

ProcessBuilder

时间:2024-04-05 16:46:26浏览次数:22  
标签:ProcessBuilder Thread cmd pb reader new

ProcessBuilder

当我们直接使用以下命令行时,会报错 CreateProcess error=2, 系统找不到指定的文件

ProcessBuilder pb = new ProcessBuilder("mvn -version");

乍一看,以为是mvn没在环境变量中,在cmd中执行了一把没问题。
原因:在代码中执行java命令时,依赖当前主应用的运行环境和进程,因此需要调用cmd命令重新为应用自己的进程开辟运行环境。
同时"cmd /c" 和真正要执行的命令,不能有空格,需要多个参数的形式存在。

ProcessBuilder pb = new ProcessBuilder("cmd", "/c", "mvn -version");

同时,防止启动一个进程并且尝试读取它的错误流时,如果你没有正确地处理这些流,可能会导致程序挂起。如果错误流中积累了太多的输出而不被消费,那么进程可能会因为缓冲区满而被阻塞。为了避免这个问题,并确保你的程序能够顺利继续运行,你需要在单独的线程中读取输入流和错误流。

ProcessBuilder pb = new ProcessBuilder(/* your command */);
Process process = pb.start();

// 处理标准输出
Thread stdoutThread = new Thread(() -> {
    try (BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()))) {
        reader.lines().forEach(System.out::println);
    } catch (IOException e) {
        e.printStackTrace();
    }
});

// 处理错误输出
Thread stderrThread = new Thread(() -> {
    try (BufferedReader reader = new BufferedReader(new InputStreamReader(process.getErrorStream()))) {
        reader.lines().forEach(System.err::println);
    } catch (IOException e) {
        e.printStackTrace();
    }
});

stdoutThread.start();
stderrThread.start();

// 等待进程以及流的线程结束
stdoutThread.join();
stderrThread.join();
int exitValue = process.waitFor();

标签:ProcessBuilder,Thread,cmd,pb,reader,new
From: https://www.cnblogs.com/DennyZhao/p/18115880

相关文章

  • Java中ProcessBuilder使用
    可以使用java中的ProcessBuilder执行本地命令或脚本等工作:以下是一个简单的使用java调用本地python脚本的例子。从某工程代码中整理出来的,未封装,仅供参考。List<String>commands=newArrayList();commands.add("python");commands.add(pkg);commands.add("--ad=test");//...其......
  • Java中使用ProcessBuilder执行命令
    在Java中我们可以使用ProcessBuilder来创建一个进程并执行命令。在使用前我们首先了了解下两个程序。一、认识命令行解释程序不论在windows中还是linux中都可以通过命令行方式来执行某些程序或脚本,而解析命令行的程序被称为shell,其本身是一种命令行解释器,用于与操作系统进行交互和......
  • 使用 ProcessBuilder API 优化你的流程
    ProcessBuilder介绍Java的ProcessAPI为开发者提供了执行操作系统命令的强大功能,但是某些API方法可能让你有些疑惑,没关系,这篇文章将详细介绍如何使用ProcessBuilderAPI来方便的操作系统命令。ProcessBuilder入门示例我们通过演示如何调用java-version命令输出JD......
  • java - 使用 ProcessBuilder 调 window cmd指令太长导致找不到
     pb.command不可使用一个长字符串指令command,需要把每个指令参数分开,放入集合中Processprocess=null;ProcessBuilderpb=newProcessBuilder();//指令太长会导致无法找到文件,被视为一个完整的指令,应该每个空格都是为一个指令......