读取java exec的输出
你好我有一些关于java的问题。 这是我的代码:
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); }
在那个代码我试图得到一个java版本命令执行是好的,但我无法读取输出它只是返回null。 为什么?
使用getErrorStream() 。
BufferedReader in = new BufferedReader(new InputStreamReader(pr.getErrorStream()));
编辑:
您可以使用ProcessBuilder (并阅读文档)
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);
请注意,我们将逐行读取进程输出到StringBuilder
。 由于try-with-resources
语句,我们不需要手动关闭流。 ProcessBuilder
类让我们向其构造函数提交程序名称和参数数量。
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(); } }
打印:
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)
您已经拥有进程 -object(名称pr)。 您可以获得Input-,Output-和Errorstream。 在你的情况下,你想要pr.getInputStream() 。 从那里读取,它连接到过程的输出。
尝试这个
public static final Pair 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])); }