leer el resultado del ejecutivo de Java
runtime runtime.exec (4)
Hola tengo alguna pregunta sobre Java. aquí está mi código:
public static void main(String[] args) throws Exception {
Process pr = Runtime.getRuntime().exec("java -version");
BufferedReader in = new BufferedReader(new InputStreamReader(pr.getInputStream()));
String line;
while ((line = in.readLine()) != null) {
System.out.println(line);
}
pr.waitFor();
System.out.println("ok!");
in.close();
System.exit(0);
}
en ese código estoy tratando de obtener un comando de ejecución de la versión java está bien, pero no puedo leer el resultado simplemente devuelve nulo. ¿Por qué?
Tenga en cuenta que estamos leyendo la salida del proceso línea por línea en nuestro StringBuilder
. Debido a la declaración try-with-resources
, no es necesario cerrar la transmisión manualmente. La clase ProcessBuilder
nos permite enviar el nombre del programa y la cantidad de argumentos a su constructor.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class ProcessOutputExample
{
public static void main(String[] arguments) throws IOException,
InterruptedException
{
System.out.println(getProcessOutput());
}
public static String getProcessOutput() throws IOException, InterruptedException
{
ProcessBuilder processBuilder = new ProcessBuilder("java",
"-version");
processBuilder.redirectErrorStream(true);
Process process = processBuilder.start();
StringBuilder processOutput = new StringBuilder();
try (BufferedReader processOutputReader = new BufferedReader(
new InputStreamReader(process.getInputStream()));)
{
String readLine;
while ((readLine = processOutputReader.readLine()) != null)
{
processOutput.append(readLine + System.lineSeparator());
}
process.waitFor();
}
return processOutput.toString().trim();
}
}
Huellas dactilares:
java version "1.8.0_45"
Java(TM) SE Runtime Environment (build 1.8.0_45-b15)
Java HotSpot(TM) 64-Bit Server VM (build 25.45-b02, mixed mode)
Use getErrorStream() .
BufferedReader in = new BufferedReader(new InputStreamReader(pr.getErrorStream()));
EDITAR:
Puede usar ProcessBuilder (y también leer la documentación)
ProcessBuilder ps=new ProcessBuilder("java.exe","-version");
//From the DOC: Initially, this property is false, meaning that the
//standard output and error output of a subprocess are sent to two
//separate streams
ps.redirectErrorStream(true);
Process pr = ps.start();
BufferedReader in = new BufferedReader(new InputStreamReader(pr.getInputStream()));
String line;
while ((line = in.readLine()) != null) {
System.out.println(line);
}
pr.waitFor();
System.out.println("ok!");
in.close();
System.exit(0);
Ya tiene el process -objeto (nombre pr). Puede obtener Input, Output y Errorstream. En tu caso, quieres pr.getInputStream() . Lea de eso, que está conectado a la salida del proceso.
prueba esto
public static final Pair<Integer,Integer> javaVersion(File file) throws IOException {
final ProcessBuilder pb = new ProcessBuilder("java", "-version");
pb.directory(new File(file.getCanonicalPath() + File.separator + "bin"));
pb.redirectErrorStream(true);
// Call the test target
final Process process = pb.start();
final InputStream in = process.getInputStream();
final InputStream err = process.getErrorStream();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(in,"UTF-8"));
String s = bufferedReader.readLine();
int start = s.indexOf(''/"'');
int end = s.lastIndexOf(''/"'');
String substring = s.substring(start + 1, end);
String[] split = substring.split("//.");
return new Pair<>(Integer.parseInt(split[0]),Integer.parseInt(split[1]));
}