studio programacion para móviles libro edición desarrollo desarrollar curso aprende aplicaciones java process exec

programacion - Programa externo de nuestro programa Java



manual de programacion android pdf (5)

¿Cómo puedo escribir un programa en Java que ejecutará otro programa? Además, la entrada de ese programa debe ser proporcionada por nuestro programa y la salida de ese programa debe escribirse en un archivo.

Este es mi pequeño conjunto de código para obtener su resultado:

Process p = Runtime.getRuntime().exec("C://j2sdk1.4.0/bin//helloworld.java"); BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream())); while ((line = input.readLine()) != null) System.out.println(line); input.close();

Este era mi conjunto de código, pero esto arroja una IOException .


Cuando solo quiere iniciar otros programas, puede usar el método exec así:

Runtime r = Runtime.getRuntime(); mStartProcess = r.exec(applicationName, null, fileToExecute); StreamLogger outputGobbler = new StreamLogger(mStartProcess.getInputStream()); outputGobbler.start(); int returnCode = mStartProcess.waitFor(); class StreamLogger extends Thread{ private InputStream mInputStream; public StreamLogger(InputStream is) { this.mInputStream = is; } public void run() { try { InputStreamReader isr = new InputStreamReader(mInputStream); BufferedReader br = new BufferedReader(isr); String line = null; while ((line = br.readLine()) != null) { System.out.println(line); } } catch (IOException ioe) { ioe.printStackTrace(); } } }

ejecutivo:

public Process exec(String command, String envp[], File dir) @param command a specified system command. @param envp array of strings, each element of which has environment variable settings in format <i>name</i>=<i>value</i>. @param dir the working directory of the subprocess, or <tt>null</tt> if the subprocess should inherit the working directory of the current process.


La API que Java ofrece para esto es ProcessBuilder . Es relativamente sencillo establecer el directorio de trabajo y pasar los parámetros.

Lo que es un poco complicado es pasar STDIN y leer STDERR y STDOUT, al menos para tamaños no triviales, porque necesita iniciar hilos separados para asegurarse de que se eliminen los buffers respectivos. De lo contrario, la aplicación que llamaste podría bloquear hasta que pueda escribir más salida, y si también esperas a que termine ese proceso (sin asegurarte de que se lea STDOUT), tendrás un punto muerto.


Puede usar java.lang.Process y java.lang.ProcessBuilder . Interactúa con la entrada / salida del proceso usando getInputStream / getOutputStream / getErrorStream.

Sin embargo, hay una biblioteca de Apache Commons llamada Exec, que está diseñada para facilitar todo esto. (Por lo general, puede ponerse bastante peludo cuando se trata de citar parámetros de línea de comandos, etc.) No he usado Exec, pero vale la pena echarle un vistazo.


¿En qué plataforma estás?

Si está en * nix puede escribir:

java MyProgram | myexternalprogram> myfilename.txt


No edite su pregunta para que ya no se ajuste a las respuestas originales. Si tiene una pregunta de seguimiento, márquelos claramente como tales o formúlelos como preguntas separadas o use comentarios o algo así.

En cuanto a su IOException, proporcione el mensaje de error que muestra.

Además, parece como si estuviera tratando de ejecutar un archivo ".java" directamente. Eso no funcionará. Los métodos que se describen aquí son para ejecutar ejecutables binarios nativos. Si desea ejecutar un archivo ".java", debe compilarlo en una clase y invocar el método principal de esa clase.