2010-04-23 16 views
4

Quelqu'un peut-il me donner un exemple de la façon de diffuser la sortie d'un programme externe exécuté avec DefaultExecutor? Je ne trouve aucune documentation décrivant comment faire cela. Mon processus externe s'exécutera pendant plusieurs heures, donc saisir simplement toutes les données de sortie n'est pas faisable; il doit être diffusé.Sortie en continu avec commons-exec?

Répondre

1

Remarque: cette solution est synchrone, de sorte qu'elle ne sera pas diffusée. Vous devez lire dans un thread séparé ou utiliser la version asynchrone de la commande execute.

private InputStream getStream() { 

String dataParsingCommand = "java"; 

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

CommandLine cl = CommandLine.parse(command); 
cl.addArgument("-jar"); 
cl.addArgument(dataParserPath); 

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

return is; 
} 
+1

Cela ne fonctionnera probablement pas pour la raison décrite dans les réponses à votre autre question à http://stackoverflow.com/questions/2702834/commons-exec-hanging-when-i-call-executor-executecommandline –

0

Voici un exemple de code pour l'utilisation de Runtime.exec. il serait simple de l'adapter à votre usage. De http://www.javaworld.com/javaworld/jw-12-2000/jw-1229-traps.html?page=4

import java.util.*; 
import java.io.*; 
class StreamGobbler extends Thread 
{ 
    InputStream is; 
    String type; 

    StreamGobbler(InputStream is, String type) 
    { 
     this.is = is; 
     this.type = type; 
    } 

    public void run() 
    { 
     try 
     { 
      InputStreamReader isr = new InputStreamReader(is); 
      BufferedReader br = new BufferedReader(isr); 
      String line=null; 
      while ((line = br.readLine()) != null) 
       System.out.println(type + ">" + line);  
      } catch (IOException ioe) 
       { 
       ioe.printStackTrace(); 
       } 
    } 
} 


public class GoodWindowsExec 
{ 
    public static void main(String args[]) 
    { 
     if (args.length < 1) 
     { 
      System.out.println("USAGE: java GoodWindowsExec <cmd>"); 
      System.exit(1); 
     } 

     try 
     {    
      String osName = System.getProperty("os.name"); 
      String[] cmd = new String[3]; 
      if(osName.equals("Windows NT")) 
      { 
       cmd[0] = "cmd.exe" ; 
       cmd[1] = "/C" ; 
       cmd[2] = args[0]; 
      } 
      else if(osName.equals("Windows 95")) 
      { 
       cmd[0] = "command.com" ; 
       cmd[1] = "/C" ; 
       cmd[2] = args[0]; 
      } 

      Runtime rt = Runtime.getRuntime(); 
      System.out.println("Execing " + cmd[0] + " " + cmd[1] 
           + " " + cmd[2]); 
      Process proc = rt.exec(cmd); 
      // any error message? 
      StreamGobbler errorGobbler = new 
       StreamGobbler(proc.getErrorStream(), "ERROR");    

      // any output? 
      StreamGobbler outputGobbler = new 
       StreamGobbler(proc.getInputStream(), "OUTPUT"); 

      // kick them off 
      errorGobbler.start(); 
      outputGobbler.start(); 

      // any error??? 
      int exitVal = proc.waitFor(); 
      System.out.println("ExitValue: " + exitVal);   
     } catch (Throwable t) 
      { 
      t.printStackTrace(); 
      } 
    } 
} 

EDIT: Cela ne puisqu'il utilise les classes JDK répond pas exactement à la question, mais cela fonctionne.

+2

La question était comment faire une invocation de processus en utilisant ** commons-exec **, qui enveloppe la plupart des choses affichées dans cette réponse. –