Ejecutar un comando desde un programa Java trabajando adecuadamente con stdin, stdout y stderr

Si quieres ejecutar un comando externo desde una aplicación Java tienes que gestionar correctamente los descriptores de ficheros de entrada, salida y error ya que sino se producirá un error. La clave está en leer los buffers de salida y error. Este es un ejemplo de cómo se hace:

import java.io.*;

public class CmdExec {

  public static void main(String argv[]) {
    try {
      String line;
      OutputStream stdin = null;
      InputStream stderr = null;
      InputStream stdout = null;

      // launch the command and grab stdin/stdout and stderr
      Process process = Runtime.getRuntime().exec("ls -la");
      stdin = process.getOutputStream();
      stderr = process.getErrorStream();
      stdout = process.getInputStream();

      // You could write to sdtin too but it's useless for the ls we are doing ;)
      line = "param1" + "n";   
      stdin.write(line.getBytes() );
      stdin.flush();

      line = "param2" + "n";
      stdin.write(line.getBytes() );
      stdin.flush();

      stdin.close();
      
      // clean up if any output in stdout
      BufferedReader brCleanUp = new BufferedReader(new InputStreamReader(stdout));
      while ((line = brCleanUp.readLine()) != null) {
        System.out.println ("[Stdout] " + line);
      }
      brCleanUp.close();
      
      // clean up if any output in stderr
      brCleanUp = 
        new BufferedReader (new InputStreamReader (stderr));
      while ((line = brCleanUp.readLine ()) != null) {
        //System.out.println ("[Stderr] " + line);
      }
      brCleanUp.close();
    } catch (Exception err) {
      err.printStackTrace();
    }
  }
}

You might also like

Run a command from a Java application dealing properly with stdin, stdout and stderr
If you want to run an external command from a Java application you have to deal properly with the input,...

Poner el pathname completo de una instalación JDK al ejecutar Oracle SQL Developer
Al ejecutar Oracle SQL Developer por primera vez te pedirá que le indiques la ruta donde tienes instalada...

Seleccionar una versión diferente de java y javac entre las disponibles en Ubuntu con update-alternatives
Se puede tener más de una versión de Java en la misma máquina.Si tienes más de una versión...

Uso de screen para dejar procesos en ejecución en un terminal
Si estás usando una conexión SSH para ejecutar un comando que tarda mucho en terminar puede usar nohup...

Dejar un comentario?

0 Comentarios.

Deje un comentario

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.