有时需要在java中调用命令行,执行命令行指令。
例如:在java中获取git的信息
第一种:ProcessBuilder方式
这里需要注意,command是一个数组,数组的第一个元素,必须是存在的可执行文件。
java.lang.ProcessBuilder#ProcessBuilder(java.util.List command) java.lang.ProcessBuilder#ProcessBuilder(java.lang.String… command) java.lang.ProcessBuilder#command(java.util.List command) java.lang.ProcessBuilder#command(java.lang.String… command) java.lang.ProcessBuilder#command()
例如:processBuilder.command(new String[]{"/bin/bash","-c", "git rev-parse HEAD"})
和processBuilder.command(new String[]{"git", "rev-parse HEAD"})
是可以的。
但是processBuilder.command(new String[]{"git rev-parse HEAD"})
是不可以的,会提示找不到文件no such file。这是因为数组的第一个元素,java中会去判断该可执行文件是否存在。
StringBuilder sbu = new StringBuilder(); try { // 使用ProcessBuilder执行命令 ProcessBuilder processBuilder = new ProcessBuilder(); processBuilder.directory(workDirectory);// 设置工作目录 processBuilder.command(command); // 读取命令执行结果 Process process = processBuilder.start(); try ( InputStream is = process.getInputStream(); InputStreamReader isr = new InputStreamReader(is, StandardCharsets.UTF_8); BufferedReader reader = new BufferedReader(isr); ) { String line; while ((line = reader.readLine()) != null) { sbu.append(line).append(System.lineSeparator()); } // 等待命令执行完成 int exitCode = process.waitFor(); //System.out.println("Exit Code: " + exitCode); } catch (Exception e) { e.printStackTrace(); } } catch (IOException e) { e.printStackTrace(); }
第二种 Runtime#exec执行
java.lang.Runtime#exec(java.lang.String command) java.lang.Runtime#exec(java.lang.String command, java.lang.String[] envp) java.lang.Runtime#exec(java.lang.String command, java.lang.String[] envp, java.io.File workFolder) java.lang.Runtime#exec(java.lang.String[] command) java.lang.Runtime#exec(java.lang.String[] command, java.lang.String[] envp) java.lang.Runtime#exec(java.lang.String[] command, java.lang.String[] envp, java.io.File workFolder)