1

javaプログラムからバッチプロセスを実行するためにcommon-exe非同期の方法を使用しようとしています。これにより、実行時にのみバッチプロセスからの出力ストリームを読み取って処理できます。

このコードがプロセスを非同期的に実行することを学びました

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");
}
4

2 に答える 2

0

ある種の委任パターン (つまり、タスクに登録するある種のリスナーまたはコールバック) を使用します。

データを読み込むときは、合意された方法でこのインターフェイスを呼び出します...

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

私見では

于 2012-10-12T05:06:15.137 に答える
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

楽しみ...

于 2013-02-07T04:29:02.317 に答える