varios sistema programa getruntime ejemplo ejecutar desde consola como comandos comando archivos java runtime

sistema - runtime.getruntime().exec java



java runtime.getruntime() obteniendo salida de la ejecución de un programa de línea de comando (7)

Estoy usando el tiempo de ejecución para ejecutar los comandos del símbolo del sistema de mi programa Java. Sin embargo, no estoy al tanto de cómo puedo obtener el resultado que devuelve el comando.

Aquí está mi código:

Runtime rt = Runtime.getRuntime(); String[] commands = {"system.exe" , "-send" , argument}; Process proc = rt.exec(commands);

Intenté hacer System.out.print(proc); pero eso no devolvió nada. La ejecución de ese comando debería devolver dos números separados por punto y coma, ¿cómo podría obtener esto en una variable para imprimir?

Aquí está el código que estoy usando ahora:

String[] commands = {"system.exe","-get t"}; Process proc = rt.exec(commands); InputStream stdin = proc.getInputStream(); InputStreamReader isr = new InputStreamReader(stdin); BufferedReader br = new BufferedReader(isr); String line = null; System.out.println("<OUTPUT>"); while ( (line = br.readLine()) != null) System.out.println(line); System.out.println("</OUTPUT>"); int exitVal = proc.waitFor(); System.out.println("Process exitValue: " + exitVal);

Pero no obtengo nada como mi salida, pero cuando ejecuto ese comando, funciona bien.


@Senthil y @Arend answer ( https://.com/a/5711150/2268559 ) mencionaron ProcessBuilder. Aquí está el ejemplo usando ProcessBuilder con las variables de entorno y la carpeta de trabajo para el comando:

ProcessBuilder pb = new ProcessBuilder("ls", "-a", "-l"); Map<String, String> env = pb.environment(); // If you want clean environment, call env.clear() first // env.clear() env.put("VAR1", "myValue"); env.remove("OTHERVAR"); env.put("VAR2", env.get("VAR1") + "suffix"); File workingFolder = new File("/home/user"); pb.directory(workingFolder); Process proc = pb.start(); BufferedReader stdInput = new BufferedReader(new InputStreamReader(proc.getInputStream())); BufferedReader stdError = new BufferedReader(new InputStreamReader(proc.getErrorStream())); // read the output from the command System.out.println("Here is the standard output of the command:/n"); String s = null; while ((s = stdInput.readLine()) != null) { System.out.println(s); } // read any errors from the attempted command System.out.println("Here is the standard error of the command (if any):/n"); while ((s = stdError.readLine()) != null) { System.out.println(s); }



Aquí está el camino a seguir:

Runtime rt = Runtime.getRuntime(); String[] commands = {"system.exe","-get t"}; Process proc = rt.exec(commands); BufferedReader stdInput = new BufferedReader(new InputStreamReader(proc.getInputStream())); BufferedReader stdError = new BufferedReader(new InputStreamReader(proc.getErrorStream())); // read the output from the command System.out.println("Here is the standard output of the command:/n"); String s = null; while ((s = stdInput.readLine()) != null) { System.out.println(s); } // read any errors from the attempted command System.out.println("Here is the standard error of the command (if any):/n"); while ((s = stdError.readLine()) != null) { System.out.println(s); }

Mejor lee el Javadoc para más detalles here . ProcessBuilder sería una buena opción para usar


Intente leer el InputStream del tiempo de ejecución:

Runtime rt = Runtime.getRuntime(); String[] commands = {"system.exe","-send",argument}; Process proc = rt.exec(commands); BufferedReader br = new BufferedReader( new InputStreamReader(proc.getInputStream())); String line; while ((line = br.readLine()) != null) System.out.println(line); }

También es posible que necesite leer la secuencia de error ( proc.getErrorStream() ) si el proceso está imprimiendo un error de salida. Puede redirigir la secuencia de error a la corriente de entrada si usa ProcessBuilder .


También podemos usar streams para obtener el resultado del comando:

public static void main(String[] args) throws IOException { Runtime runtime = Runtime.getRuntime(); String[] commands = {"free", "-h"}; Process process = runtime.exec(commands); BufferedReader lineReader = new BufferedReader(new InputStreamReader(process.getInputStream())); lineReader.lines().forEach(System.out::println); BufferedReader errorReader = new BufferedReader(new InputStreamReader(process.getErrorStream())); errorReader.lines().forEach(System.out::println); }


Una forma más rápida es esta:

public static String execCmd(String cmd) throws java.io.IOException { java.util.Scanner s = new java.util.Scanner(Runtime.getRuntime().exec(cmd).getInputStream()).useDelimiter("//A"); return s.hasNext() ? s.next() : ""; }

Que es básicamente una versión condensada de esto:

public static String execCmd(String cmd) throws java.io.IOException { Process proc = Runtime.getRuntime().exec(cmd); java.io.InputStream is = proc.getInputStream(); java.util.Scanner s = new java.util.Scanner(is).useDelimiter("//A"); String val = ""; if (s.hasNext()) { val = s.next(); } else { val = ""; } return val; }

Sé que esta pregunta es antigua pero publico esta respuesta porque creo que esto puede ser más rápido.


adaptado de la respuesta anterior

public static String execCmdSync(String cmd, CmdExecResult callback) throws java.io.IOException, InterruptedException { RLog.i(TAG, "Running command:", cmd); Runtime rt = Runtime.getRuntime(); Process proc = rt.exec(cmd); //String[] commands = {"system.exe","-get t"}; BufferedReader stdInput = new BufferedReader(new InputStreamReader(proc.getInputStream())); BufferedReader stdError = new BufferedReader(new InputStreamReader(proc.getErrorStream())); StringBuffer stdout = new StringBuffer(); StringBuffer errout = new StringBuffer(); // read the output from the command System.out.println("Here is the standard output of the command:/n"); String s = null; while ((s = stdInput.readLine()) != null) { System.out.println(s); stdout.append(s); } // read any errors from the attempted command System.out.println("Here is the standard error of the command (if any):/n"); while ((s = stdError.readLine()) != null) { System.out.println(s); errout.append(s); } if (callback == null) { return stdInput.toString(); } int exitVal = proc.waitFor(); callback.onComplete(exitVal == 0, exitVal, errout.toString(), stdout.toString(), cmd); return stdInput.toString(); } public interface CmdExecResult{ void onComplete(boolean success, int exitVal, String error, String output, String originalCmd); }