Java common exe:在单独的线程中运行批处理以并行读取批处理输出
我正在尝试使用公共exe异步方式从java程序运行批处理过程,以便仅在运行时读取和处理批处理过程的输出流 我已经了解到,这段代码以异步方式运行流程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
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();
}
}
}
这里是文档和教程的链接
享受