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



我正在尝试使用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");
}

我会使用某种委托模式(即您将向任务注册的某种侦听器或回调)。

当您读取数据时,您将通过商定的方法调用此接口...

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

恕我直言

我在SwingWorker abstract class的帮助下获得了这个功能。这个抽象类提供了几个要重写的 API,这些 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.htmlhttp://en.wikipedia.org/wiki/SwingWorker

享受。。。

最新更新