项目中有个需求是备份数据库,备份数据库很自然的想到使用mysqldump进行转储,那么问题的关键就变成了如何在java中调用mysqldump命令,一搜才知道通过开启一个本地的进程,来执行该命令即可。
Process的产生有两种方式:Runtime.getRuntime.exec(cmd),另一种是通过ProcessBuilder builder,builder.start()。
Process是一个抽象类,只能通过这两种方式来获取一个Process对象。在获取到Process之后,可以通过getInputStream()获取子进程的输出流,注意,子进程没有console,因此,它的stdout\stdin\stderr都被重定向到父进程,也就是java进程中。

Runtime

起初采用Runtime来进行操作,方法如下:
String cmd = “mysqldump.exe -h ” + host + ” -u ” + username + ” -p” + password + ” ” + dbName;
Process process = Runtime.getRuntime().exec(cmd);

这个方法可以正常work,但是我查询JDK,发现官方推荐是使用ProcessBuilder,原因是
Because some native platforms only provide limited buffer size for standard input and output streams, failure to promptly write the input stream or read the output stream of the subprocess may cause

项目中有个需求是备份数据库,备份数据库很自然的想到使用mysqldump进行转储,那么问题的关键就变成了如何在java中调用mysqldump命令,一搜才知道通过开启一个本地的进程,来执行该命令即可。 Process的产生有两种方式:Runtime.getRuntime.exec(cmd),另一种是通过ProcessBuilder builder,builder.start()。 Process public static void main(String[] args) { Md5sumCommand command = new Md5sumCommand("test.txt"); Command.Result result = command.execute(); System.out.println(result.code); // exit code
java调用shell脚本和命令- ProcessBuilder 方式 在上一节 ,我使用Runtime的方式,实现了对 命令行 和脚本文件的运行。最后我留下了一个小小的问题那就是这个InputStream和errorStream需要分开获取,那有没有其他方,不用分开获取流呢? 1.相关文档 答案当然是有的,这就是这章节要使用的 ProcessBuilder 方式了。 同样的,也先看下 ProcessBuilder 的API吧。 类用于创建操作系统进程。 每个 ProcessBuilder 实例管理一个进程属性集。sta
1、使用JAVA调用bat文件的API //env这个Map的key和bat文件 的%key%的值要一样,这样才能替换bat里面的key的值! ProcessBuilder pBuilder = new ProcessBuilder (comm); if (env != null) { Map penv = pBuilder.environment(); //获得进程的环境 Iterato
public class ProcessBuilder Demo { public void exeLocalCommand(String exportCmd) throws Exception{ ProcessBuilder builder; String charSet; jkd8 的特性。冒泡排序;zk、redis(最大) ProcessBuilder .start() 和 Runtime.exec() 方法都被用来创建一个操作系统进程(执行 命令行 操作),并返回 Process 子类的一个实例,该实例可用来控制进程状态并获得相关信息。 ProcessBuilder 是一个final类,Process是一个抽象类。 每个进程生成器(即Pr...
ProcessBuilder 类可以通过调用start()方法来启动一个进程,并且可以通过调用process对象的getInputStream()、getOutputStream()、getErrorStream()方法来获取进程的标准输入、输出和错误输出流。通过标准输入流,可以向进程发送 命令行 参数 或者输入数据,通过标准输出流和错误输出流,可以获取进程的输出信息和错误信息。可以使用BufferedReader和PrintWriter等类来读取和写入数据。例如,可以使用以下代码与 命令行 交互: ProcessBuilder pb = new ProcessBuilder ("cmd.exe"); Process p = pb.start(); BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream())); PrintWriter pw = new PrintWriter(new OutputStreamWriter(p.getOutputStream())); pw.println("dir"); pw.flush(); String line; while ((line = br.readLine()) != null) { System.out.println(line); 这段代码启动了一个cmd.exe进程,并向其发送了一个dir命令,然后读取了进程的输出信息并打印到控制台上。