最简单的方法:你应该使用start
. 也可以设置工作目录,看这个例子:
Runtime r=Runtime.getRuntime();
r.exec("cmd.exe /c start compile.bat", //path to executable
null, // env vars, null means pass parent env
new File("C:\\blahblah")); // working directory
附加信息:如果您不想在它的单独控制台中启动您的进程(这就是start
您可以做的)r.exec("cmd.exe /c compile.bat");
,但因为它在其父控制台的上下文中执行,您必须等待p.waitFor()
或读取它的输入流 - 否则它可能会静默失败。这将运行并显示您的命令的输出:
Process p=r.exec("cmd.exe /c compile.bat", //path to executable
null, // env vars, null means pass parent env
new File("C:\\blahblah"));
InputStream is=p.getInputStream();
BufferedReader br= new BufferedReader(new InputStreamReader(is));
String line=new String();
while ((line=br.readLine())!=null) System.out.println (line);
同样从 1.5 开始, ProcessBuilder 是启动进程的首选方式(来自 Java doc):
java.lang.进程
创建进程的方法可能不适用于某些本机平台上的特殊进程,例如本机窗口进程、守护进程、Microsoft Windows 上的 Win16/DOS 进程或 shell 脚本。
默认情况下,创建的子进程没有自己的终端或控制台。它的所有标准I/O(即stdin、stdout、stderr)操作都将被重定向到父进程,在那里可以通过使用getOutputStream()、getInputStream() 和getErrorStream() 方法获得的流来访问它们。父进程使用这些流向子进程提供输入并从子进程获取输出。由于部分原生平台只为标准输入输出流提供有限的缓冲区大小,未能及时写入子进程的输入流或读取输出流可能会导致子进程阻塞,甚至死锁。
如果需要,也可以使用 ProcessBuilder 类的方法重定向子进程 I/O。
当没有更多对 Process 对象的引用时,子进程不会被终止,而是子进程继续异步执行。
不要求由 Process 对象表示的进程相对于拥有该 Process 对象的 Java 进程异步或并发执行。
从 1.5 开始,ProcessBuilder.start() 是创建流程的首选方式。
自:JDK1.0