Java common-exe:在单独的线程中运行批处理以并行读取批处理输出

时间:2012-10-12 05:02:24

标签: java batch-file batch-processing

我正在尝试使用common-exe异步方式从java程序运行批处理,这样我就可以在运行时从批处理中读取和处理输出流。

我了解到这段代码是异步运行的过程

DefaultExecuteResultHandler resultHandler = new DefaultExecuteResultHandler();
CommandLine cmdLine = new CommandLine("some batch file"); 
Executor executor = new DefaultExecutor(); 
executor.execute(cmdLine, resultHandler);

但现在我的问题是如何从批处理文件中并行执行读出流出。我必须处理输出流中的一些信息。

这是我正在尝试的一段代码..我无法弄清楚如何解决我的问题..

String command = "some batch file.bat";
PipedOutputStream pipedOutputStream = new PipedOutputStream();
PumpStreamHandler pumpStreamHandler = new PumpStreamHandler(pipedOutputStream);
CommandLine commandLine = null;

DefaultExecutor defaultExecutor = new DefaultExecutor();
DataInputStream dataInputStream = null;
DefaultExecuteResultHandler executeResultHandler = new DefaultExecuteResultHandler();

commandLine.parse(command);

try {
    dataInputStream = new DataInputStream(new PipedInputStream(pipedOutputStream));
    defaultExecutor.setStreamHandler(pumpStreamHandler);
    defaultExecutor.execute(commandLine, executeResultHandler);

    InputStream outCmdStream = null;
    pumpStreamHandler.setProcessOutputStream(outCmdStream);
    InputStreamReader outCmdReader = new InputStreamReader(outCmdStream);
    BufferedReader outCmdBufReader = new BufferedReader(outCmdReader);
    String procOutputStr;
    while ((procOutputStr = dataInputStream.readLine()) != null) {
        System.out.println(procOutputStr);
    }
} catch (IOException e) {
    e.printStackTrace();
    System.out.println("ERROR.RUNNING.CMD");
    e.printStackTrace();
    System.out.println("ERROR.RUNNING.CMD");
}

2 个答案:

答案 0 :(得分:0)

我会使用某种类型的委托模式(即某种类型的监听器或回调,你会注册任务)。

当您阅读数据时,您可以通过商定的方法调用此界面...

while ((procOutputStr = dataInputStream.readLine()) != null) {
    outputHandler.processOutput(procOutputStr);
}

IMHO

答案 1 :(得分:0)

我在SwingWorker抽象类的帮助下获得了这个功能。 这个抽象类提供了几个要覆盖的API,可以用来在后台执行任务。

以下示例显示了如何使用swingworker执行后台线程。

    private Document doc;
 ...
 SwingWorker<Document, Void> worker = new SwingWorker<Document, Void>() {
   @Override
   public Document doInBackground() {
      // any action you want to perform in backgroud
      // i.e. in separate thread
   }
   @Override
   public void done() {
     try {
        // called after background thread is finished
     } catch (InterruptedException ex) {
       ex.printStackTrace();
     } catch (ExecutionException ex) {
       ex.printStackTrace();
     }
   }
 }

以下是文档和教程的链接 http://docs.oracle.com/javase/tutorial/uiswing/concurrency/worker.html http://en.wikipedia.org/wiki/SwingWorker

...享受