Saltar al contenido

Ejecutar un programa java desde otro programa java

Hacemos una revisión completa cada reseñas de nuestro espacio con el objetivo de mostrarte en todo momento información con la mayor veracidad y actualizada.

Solución:

Es un poco extraño, pero puedes ejecutar el segundo programa sin bifurcarlo. Simplemente llamando al método principal en él. Así que olvídate de la sección de tiempo de ejecución y haz esto:

sam2.main(new String[0]);

Por supuesto, de esta manera debe compilar sam2 en tiempo de compilación

Cada proceso debe poder ejecutarse y finalizar. Puedes usar Process#waitFor para este propósito. Del mismo modo, debe consumir cualquier salida del proceso al mismo tiempo. waitFor bloqueará, por lo que necesitará usar un Thread para leer la entrada (y si es necesario, escribir la salida en el proceso)

Dependiendo de la ubicación del archivo java/class, es posible que también deba especificar una carpeta de inicio desde la cual pueda comenzar la ejecución del proceso.

La mayor parte de esto es significativamente más fácil usando ProcessBuilder

import java.io.File;
import java.io.IOException;
import java.io.InputStream;

public class CompileAndRun 

    public static void main(String[] args) 
        new CompileAndRun();
    

    public CompileAndRun()  InterruptedException ex) 
            ex.printStackTrace();
        
    

    public int run(String clazz) throws IOException, InterruptedException         
        ProcessBuilder pb = new ProcessBuilder("java", clazz);
        pb.redirectError();
        pb.directory(new File("src"));
        Process p = pb.start();
        InputStreamConsumer consumer = new InputStreamConsumer(p.getInputStream());
        consumer.start();

        int result = p.waitFor();

        consumer.join();

        System.out.println(consumer.getOutput());

        return result;
    

    public int compile(String file) throws IOException, InterruptedException         
        ProcessBuilder pb = new ProcessBuilder("javac", file);
        pb.redirectError();
        pb.directory(new File("src"));
        Process p = pb.start();
        InputStreamConsumer consumer = new InputStreamConsumer(p.getInputStream());
        consumer.start();

        int result = p.waitFor();

        consumer.join();

        System.out.println(consumer.getOutput());

        return result;        
    

    public class InputStreamConsumer extends Thread 

        private InputStream is;
        private IOException exp;
        private StringBuilder output;

        public InputStreamConsumer(InputStream is) 
            this.is = is;
        

        @Override
        public void run() 
            int in = -1;
            output = new StringBuilder(64);
            try 
                while ((in = is.read()) != -1) 
                    output.append((char) in);
                
             catch (IOException ex) 
                ex.printStackTrace();
                exp = ex;
            
        

        public StringBuilder getOutput() 
            return output;
        

        public IOException getException() 
            return exp;
        
    

Ahora, obviamente, debe verificar los resultados de retorno de los procesos, y puede producir un mejor mecanismo para interactuar con los procesos, pero esa es la idea básica …

Comentarios y calificaciones

Más adelante puedes encontrar las críticas de otros usuarios, tú incluso tienes el poder dejar el tuyo si dominas el tema.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *