有时需要在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)
沪公网安备 31011502001064号