por - Ejecutar programa externo desde Java
runtime.getruntime().exec java (3)
La respuesta de mdma funciona (y la voté), pero también es posible que desee considerar la versión donde lee el flujo de salida directamente desde el executable
:
Process p = Runtime.getRuntime().exec(new String[]{
"/bin/bash", "-c", "executable"});
p.waitFor();
BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream())_;
while ((line = input.readLine()) != null) {
System.out.println(line);
}
Estoy tratando de ejecutar un programa desde el código de Java. Aquí está mi código:
public static void main(String argv[]) {
try {
String line;
Process p = Runtime.getRuntime().exec(new String[]{
"/bin/bash", "-c", "executable -o filename.txt"});
BufferedReader input = new BufferedReader(
new InputStreamReader(p.getInputStream()));
while ((line = input.readLine()) != null) {
System.out.println(line);
}
input.close();
} catch (Exception err) {
err.printStackTrace();
}
}
Mi sistema operativo es Mac OS X 10.6.
Ahora, el ejecutable que estoy tratando de ejecutar se supone que escupió la salida a filename.txt. Si tomo este comando y lo ejecuto en la terminal, funciona bien y también se llena el nombre de archivo.txt. Pero, desde mi programa java, el archivo no se crea.
si, en cambio, utilizo executable> filename.txt, entonces se crea el archivo filename.txt, pero está vacío. No estoy seguro de lo que está mal aquí. El ejecutable que intento ejecutar es Xtide (si eso ayuda).
Realmente agradecería cualquier ayuda que pueda obtener.
Gracias,
No puede redirigir salida a archivo y leer la salida en java. Es una u otra. Lo que quieres es esto:
Process p = Runtime.getRuntime().exec(new String[]{
"/bin/bash", "-c", "executable -o filename.txt"});
p.waitFor();
BufferedReader input = new BufferedReader(
new InputStreamReader(new FileInputStream("filename.txt")));
while ((line = input.readLine()) != null) {
System.out.println(line);
}
Los principales cambios son:
-
p.waitFor()
, ya que la ejecución del proceso es asincrónica, por lo que debe esperar a que se complete. - Los datos se leen desde el archivo en lugar de desde el resultado del proceso (ya que esto estará vacío).
Corrígeme si estoy equivocado, pero los síntomas son los siguientes:
-
exec("/usr/bash", "-c", "executable > filename.txt")
crea un archivo vacío. -
exec("/usr/bash", "-c", "executable -o filename.txt")
no crea un archivo. - Uno o ambos de los anteriores dan un código de salida de
255
cuando lo miras. - Cuando ejecuta el comando desde la línea de comando como
executable -o filename.txt
oexecutable > filename.txt
, funciona como se esperaba.
A la luz de lo anterior, creo que la causa más probable es que /bin/bash
no encuentre el executable
cuando lo inicie desde Java. El hecho de que el primer ejemplo crea un archivo vacío significa que /bin/bash
está haciendo algo. Pero si intentas correr
$ unknown-command > somefile.txt
desde un mensaje de bash shell aparecerá un mensaje de error que indica que el comando no se puede encontrar y un archivo "something.txt" vacío . (No vería el mensaje de error en su aplicación Java porque se está escribiendo en stderr, y no lo está capturando). La razón por la que se crea el archivo "algo.txt" vacío es porque el intérprete de comandos lo abrió intenta bifurcar y ejecutar el "ejecutable".
Si este es el problema , entonces la solución simple es usar el nombre de ruta absoluto para el ejecutable.
Además, si no está haciendo ninguna redirección de línea de comando u otra magia de shell, no hay necesidad de ejecutar el ejecutable en una nueva instancia de bash
. Por el contrario, solo haz esto:
Process p = Runtime.getRuntime().exec("executable", "-o", filename.txt");
luego espere a que se complete el proceso y verifique el código de salida antes de tratar de leer el contenido del archivo.