从javaexec读取输出

从javaexec读取输出,java,runtime,runtime.exec,Java,Runtime,Runtime.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;

你好,我有一些关于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版本的命令execute是可以的,但是我无法读取输出,它只返回null。为什么?

您已经有了-object(名称pr)。您可以获得输入、输出和错误流。在你的情况下,你想要。从中读取,它连接到进程的输出。

使用

编辑:

您可以使用(也可以阅读文档)


请注意,我们正在将流程输出逐行读取到我们的文件中。由于该语句,我们不需要手动关闭流。类让我们将程序名和参数数提交给它的构造函数

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)
试试这个

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]));
}
publicstaticfinalpairjavaversion(File)抛出IOException{
最终ProcessBuilder pb=新的ProcessBuilder(“java”和“-version”);
pb.directory(新文件(File.getCanonicalPath()+File.separator+“bin”);
pb.重定向错误流(真);
//调用测试目标
最终过程=pb.start();
final InputStream in=process.getInputStream();
final InputStream err=process.getErrorStream();
BufferedReader BufferedReader=新的BufferedReader(新的InputStreamReader(在“UTF-8”中));
字符串s=bufferedReader.readLine();
int start=s.indexOf(“\”);
int end=s.lastIndexOf(“\”);
String substring=s.substring(开始+1,结束);
String[]split=substring.split(“\\”);
返回新的对(Integer.parseInt(split[0]),Integer.parseInt(split[1]);
}

我也遇到了这个问题,因为我没有正确设置$JAVA\u HOME。(我忘了内容/家)。

编辑$JAVA_HOME后,更新Gradle JVM,并删除.idea目录以使用Gradle重新构建,它工作得很好。

好,可以了。但奇怪的是,从错误流中读取命令的正常输出。@max-看看-@AVD,其中描述了如何合并错误和标准输出。但不能描述为什么它被标记为“错误”。这看起来真的很奇怪。@adatapost如果我在阅读这个流的同时使用
Process.waitFor()
,该方法是什么?e、 g.正在进行下载。
是否必须完成打印,然后我可以点击我的逻辑强制销毁进程(例如
pr.destory()
),我想知道它们是否可以并行执行。如果您正在做一些事情:
new ProcessBuilder().command().inheritIO()
删除
inheritIO())
或者流将被重定向到控制台,而不是
中的
为什么他必须添加waitFor?
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)
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]));
}