2010-04-24 6 views
3

Je ne sais pas pourquoi cela est suspendu. J'essaye de capturer la sortie d'un processus exécuté par l'intermédiaire de commons-exec, et je continue à accrocher. J'ai fourni un exemple de programme pour illustrer ce comportement ci-dessous.commons-exec: suspendu lorsque j'appelle executor.execute (commandLine);

import java.io.DataInputStream; 
import java.io.IOException; 
import java.io.PipedInputStream; 
import java.io.PipedOutputStream; 
import org.apache.commons.exec.CommandLine; 
import org.apache.commons.exec.DefaultExecutor; 
import org.apache.commons.exec.ExecuteException; 
import org.apache.commons.exec.PumpStreamHandler; 
public class test { 

public static void main(String[] args) { 
    String command = "java"; 

    PipedOutputStream output = new PipedOutputStream(); 
    PumpStreamHandler psh = new PumpStreamHandler(output); 

    CommandLine cl = CommandLine.parse(command); 

    DefaultExecutor exec = new DefaultExecutor(); 
    DataInputStream is = null; 
    try { 
     is = new DataInputStream(new PipedInputStream(output)); 
     exec.setStreamHandler(psh); 
     exec.execute(cl); 
    } catch (ExecuteException ex) { 
    } catch (IOException ex) { 
    } 

    System.out.println("huh?"); 
} 
} 

Répondre

9

Selon le javadoc, execute(CommandLine command) est synchrone, execute(CommandLine command, ExecuteResultHandler handler) d'autre part est asynchrone.

5

La commande que vous avez appelée, java, génère une sortie vers son flux de sortie standard. Ce flux doit être pompé dans un flux d'entrée par votre programme d'appel. Cela n'arrive pas dans votre programme.

Vous devez lire le flux d'entrée (is dans votre code) dans un fil séparé, car c'est ainsi que fonctionnent les flux canalisés. Notez que vous devez démarrer le fil de lecture avant d'appeler le execute().

Voir aussi Capturing large amounts of output from Apache Commons-Exec

Selon votre autre question que vous attendez Streaming output with commons-exec? grandes quantités de données, vous devez donc utiliser les flux canalisé et ne peut pas utiliser l'approche plus simple d'utiliser un ByteArrayInputStream en sortie. La réponse que vous vous donnez ici, souffre du même problème que votre code ici.

Questions connexes