Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java common exe:在单独的线程中运行批处理以并行读取批处理输出_Java_Batch File_Batch Processing - Fatal编程技术网

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

Java common exe:在单独的线程中运行批处理以并行读取批处理输出,java,batch-file,batch-processing,Java,Batch File,Batch Processing,我正在尝试使用公共exe异步方式从java程序运行批处理过程,以便仅在运行时读取和处理批处理过程的输出流 我已经了解到,这段代码以异步方式运行流程 DefaultExecuteResultHandler resultHandler = new DefaultExecuteResultHandler(); CommandLine cmdLine = new CommandLine("some batch file"); Executor executor = new DefaultExecuto

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

我会使用某种委托模式(即某种监听器或回调,您将向task注册)

当您读入数据时,您将通过约定的方法调用此接口

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

IMHO

我在SwingWorker抽象类的帮助下获得了这个特性。 这个抽象类提供了几个要重写的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();
     }
   }
 }
私人文件文档;
...
SwingWorker worker=新SwingWorker(){
@凌驾
公共文件doInBackground(){
//您希望在后台执行的任何操作
//即,在单独的线程中
}
@凌驾
公众假期结束(){
试一试{
//后台线程完成后调用
}捕获(中断异常例外){
例如printStackTrace();
}捕获(ExecutionException ex){
例如printStackTrace();
}
}
}
这里是文档和教程的链接

享受