使用ProcessBuilder查找Java版本

时间:2015-06-03 18:50:10

标签: java processbuilder

我正在尝试使用Java来查找计算机上安装的Java版本。我有:

List<String> commands = new ArrayList<String>();
commands.add("java.exe");
commands.add("-version");
ProcessBuilder pb = new ProcessBuilder(commands);
pb.directory(new File("C:\\Program Files\\Java\\jdk1.6.0_45\\bin"));
Process p = pb.start();
BufferedReader stdInput = new BufferedReader(new InputStreamReader(p.getInputStream()));

while ((s = stdInput.readLine()) != null) {
    System.out.println(s);
}

但是,运行此命令时,从不执行while循环,因为stdInput为空。如果我取出commands.add("-version"),它将获得运行&#34; java.exe&#34;时输出的输入。命令行命令,所以似乎添加-version争论导致问题,这也表明目录和java.exe命令是正确的。任何帮助,将不胜感激。

2 个答案:

答案 0 :(得分:6)

java -version的输出被发送到错误流 - 从该流读取应该得到正确的输出:

BufferedReader stdInput = new BufferedReader(new InputStreamReader(p.getErrorStream()));

或者,您可以调用redirectErrorStream(true)来合并输入和错误流。如果您只想打印到命令行,可以在ProcessBuilder上使用inheritIO

通过检索相应的System property

,无需ProcessBuilder即可找到当前正在运行的java版本
System.out.println(System.getProperty("java.version"));

答案 1 :(得分:1)

java -version打印到stderr。尝试使用:

ProcessBuilder pb = new ProcessBuilder(commands).redirectErrorStream(true);

这会将stderr放在与stdout相同的流中,其余代码可以像现在一样。