我想在我的程序的中间执行批处理文件(这将启动另一个Java应用程序)。 我不想等待,或者看它是否成功执行,也没有我想从执行该批处理文件中捕捉错误回报。 我开始该批处理文件之后,我想做其他的东西,而不是等待之后我执行的那批。
我是否需要采取输出和错误的护理? 有没有什么办法来摆脱服用输出和错误的护理。
这是我的第二个职位,以清除我的关于这一主题的混乱,所以请具体到这个问题,只是不扔链接,如何process.exe或的ProcessBuilder。
任何帮助表示赞赏。
我想在我的程序的中间执行批处理文件(这将启动另一个Java应用程序)。 我不想等待,或者看它是否成功执行,也没有我想从执行该批处理文件中捕捉错误回报。 我开始该批处理文件之后,我想做其他的东西,而不是等待之后我执行的那批。
我是否需要采取输出和错误的护理? 有没有什么办法来摆脱服用输出和错误的护理。
这是我的第二个职位,以清除我的关于这一主题的混乱,所以请具体到这个问题,只是不扔链接,如何process.exe或的ProcessBuilder。
任何帮助表示赞赏。
简短的回答:不会。正如每个进程的javadoc ,
由于某些本机平台仅提供用于标准输入和输出流有限缓冲区的大小,没有及时写输入流或读出的子过程的输出流可能会导致子阻塞,甚至死锁。
所以,你必须照顾标准错误和stdout处理,如果你希望你的程序是远程强劲。
说了这么多,如果你真的不关心他们的内容(这是一个坏主意-什么?如果批处理失败,一个有用的错误消息,您放弃),你可以只火了线程他们阅读,按杰伊R.的答案 。 这将让你的逻辑线程继续,而不用担心流的状态,流食会在后台运行,直到流被耗尽。 你甚至可能要创建一个围绕包装Runtime.exec()
将触发关闭线程为你做这个,如果你发现自己这样做了很多。
我会,但是,至少从登录批处理过程的输出,如果你不打算解读为此它在你的代码。 当出现错误的批次,分析问题会随着进程的输出钻研容易得多。
我发现,如果你不至少吃输出和错误最终你会耗尽内存。 也有人阻止我运行多个进程同时进行。
我一直在使用一类我叫ProcessStreamEater做到这一点。
public class ProcessStreamEater implements Runnable
{
private final Process proc;
public ProcessStreamEater(Process proc)
{
this.proc = proc;
}
@Override
public void run()
{
InputStreamReader r = new InputStreamReader(proc.getInputStream());
try
{
while(r.read() != -1)
{ // put stuff here if you want to do something with output
// otherwise, empty
}
}
catch(IOException e)
{
// handle IO exception
}
finally
{
if(r != null)
{
try
{
r.close();
}
catch(IOException c)
{}
}
}
}
}
然后,当我用它吃东西...
ProcessBuilder pb = new ProcessBuilder(args);
pb.redirectErrorStream(true);
final Process proc = pb.start();
executorService.execute(new ProcessStreamEater(proc));
其中的ExecutorService用创建Executors.newCachedThreadPool ()
如果你的过程中不产生任何输出到标准输出或stderror那么你可能并不需要处理它。 如果你的子过程确实产生可能永远阻止试图写入stdout输出,这取决于有多少OS管道缓冲。 这里有什么地方流冲洗器的一个例子 - 这每个人都使用。
我想你只需要这样的:
Runtime run = Runtime.getRuntime();
Process p = null;
String cmd = "D:\\a.bat";
try {
p = run.exec(cmd);
}catch(Exception e){
//do handling
}
//你的代码
记得拨打p.destroy()后面的代码。 你也可以产卵以上单独的线程代码。 希望这可以帮助。