Processus de sortie de apache commons exec

Je suis à bout de ressources ici. Je suis sûr que c'est quelque chose de simple et j'ai plus de chances d'avoir d'énormes trous dans ma compréhension de java et de ruisseaux. Je pense que il ya tellement de nombreuses classes que je suis un peu débordé avec le fait d'essayer de pousser à travers l'API de comprendre quand et comment je veux utiliser la multitude de flux d'entrées-sorties.

J'ai juste appris à propos de l'existence de l'apache commons (bibliothèque de l'enseignement de soi java échec), et suis en train d'essayer de convertir une partie de mon Exécution.getRuntime().exec pour utiliser les communes - exec. Déjà c'est corrigé certains une fois tous les 6 mois ce problème cultures en place, puis s'en va problèmes de style avec exec.

Le code s'exécute un script perl, et affiche la sortie standard du script dans le GUI comme il est en cours d'exécution.

Le code d'appel est à l'intérieur d'un swingworker.

Je suis perdu comment utiliser le pumpStreamHandler... en tout cas voici le code:

String pl_cmd = "perl script.pl"
Process p_pl = Runtime.getRuntime().exec( pl_cmd );

BufferedReader br_pl = new BufferedReader( new InputStreamReader( p_pl.getInputStream() ) );

stdout = br_pl.readLine();
while ( stdout != null )
{
    output.displayln( stdout );
    stdout = br_pl.readLine();
}

Je suppose que c'est ce que je reçois pour le copier-coller le code je ne comprends pas tout, il y a longtemps. La-dessus je suppose est en cours d'exécution le processus, puis saisit le outputstream (via "getInputStream"?), place dans un tampon lecteur, puis boucle sera juste là jusqu'à ce que le tampon est vide.

Ce que je ne comprends pas est pourquoi il n'est pas nécessaire pour une "attente" de style de commande ici? N'est-il pas possible qu'il y ait un certain temps dans lequel le tampon est vide, la sortie de la boucle, et de continuer tant que le processus est toujours en cours? Quand je le lance, cela ne semble pas être le cas.

En tout cas, je vais essayer d'obtenir le même comportement à l'aide de communes exec, encore une fois aller à partir de google a trouvé le code:

DefaultExecuteResultHandler rh = new DefaultExecuteResultHandler();
ExecuteWatchdog wd  = new ExecuteWatchdog( ExecuteWatchdog.INFINITE_TIMEOUT );
Executor exec = new DefaultExecutor();

ByteArrayOutputStream out = new ByteArrayOutputStream();
PumpStreamHandler psh = new PumpStreamHandler( out );

exec.setStreamHandler( psh );
exec.setWatchdog( wd );

exec.execute(cmd, rh );
rh.waitFor();

Je suis à essayer de comprendre ce pumpstreamhandler est en train de faire. Je suppose que cela va prendre la sortie de l'exec de l'objet, et de remplir le OutputStream-je fournir avec les octets à partir du script perl est stdout/err?

Si oui, comment voulez-vous obtenir le comportement de l'avoir de flux de la ligne de sortie en ligne? Dans les exemples les gens vous montrent appel de la sortir.toString() à la fin, et je suppose que ce serait tout simplement me donner un dump de toutes les données de sortie à partir du script une fois que c'est fait en cours? Comment voulez-vous faire de sorte qu'il affiche la sortie comme il est en cours d'exécution ligne par ligne?

------------L'Avenir Modifier ---------------------

Trouvé via google et travaille à nice ainsi:

public static void main(String a[]) throws Exception
{
    ByteArrayOutputStream stdout = new ByteArrayOutputStream();
    PumpStreamHandler psh = new PumpStreamHandler(stdout);
    CommandLine cl = CommandLine.parse("ls -al");
    DefaultExecutor exec = new DefaultExecutor();
    exec.setStreamHandler(psh);
    exec.execute(cl);
    System.out.println(stdout.toString());
}
  • Je suis aussi en train d'essayer d'obtenir l'erreur/d'entrée/sortie de flux de ExecuteResultHandler et de le jeter sur un JTextPane. A la méthode ci-dessus, travaillé ou vous avez utilisé ExecuteResultHandler sera/En/Erreur de le faire ?
  • Ce n'est pas vous, c'est de Java 🙂 Ce serait trivial avec "backticks" dans un (POSIX) script, ou même popen en C (ou d'autres POSIX amical language) est un complexe de silly-pied en Java.