使用Process.exec(using Process.exec)

2019-10-29 11:29发布

我想在我的程序的中间执行批处理文件(这将启动另一个Java应用程序)。 我不想等待,或者看它是否成功执行,也没有我想从执行该批处理文件中捕捉错误回报。 我开始该批处理文件之后,我想做其他的东西,而不是等待之后我执行的那批。

我是否需要采取输出和错误的护理? 有没有什么办法来摆脱服用输出和错误的护理。

这是我的第二个职位,以清除我的关于这一主题的混乱,所以请具体到这个问题,只是不扔链接,如何process.exe或的ProcessBuilder。

任何帮助表示赞赏。

Answer 1:

简短的回答:不会。正如每个进程的javadoc ,

由于某些本机平台仅提供用于标准输入和输出流有限缓冲区的大小,没有及时写输入流或读出的子过程的输出流可能会导致子阻塞,甚至死锁。

所以,你必须照顾标准错误和stdout处理,如果你希望你的程序是远程强劲。

说了这么多,如果你真的不关心他们的内容(这是一个坏主意-什么?如果批处理失败,一个有用的错误消息,您放弃),你可以只火了线程他们阅读,按杰伊R.的答案 。 这将让你的逻辑线程继续,而不用担心流的状态,流食会在后台运行,直到流被耗尽。 你甚至可能要创建一个围绕包装Runtime.exec()将触发关闭线程为你做这个,如果你发现自己这样做了很多。

我会,但是,至少从登录批处理过程的输出,如果你不打算解读为此它在你的代码。 当出现错误的批次,分析问题会随着进程的输出钻研容易得多。



Answer 2:

我发现,如果你不至少吃输出和错误最终你会耗尽内存。 也有人阻止我运行多个进程同时进行。

我一直在使用一类我叫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 ()



Answer 3:

如果你的过程中不产生任何输出到标准输出或stderror那么你可能并不需要处理它。 如果你的子过程确实产生可能永远阻止试图写入stdout输出,这取决于有多少OS管道缓冲。 这里有什么地方流冲洗器的一个例子 - 这每个人都使用。



Answer 4:

我想你只需要这样的:

Runtime run = Runtime.getRuntime();  
Process p = null;  
String cmd = "D:\\a.bat";     
try {     
  p = run.exec(cmd);
}catch(Exception e){
  //do handling
}

//你的代码

记得拨打p.destroy()后面的代码。 你也可以产卵以上单独的线程代码。 希望这可以帮助。



文章来源: using Process.exec