我正在尝试使用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");
}
答案 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
...享受