从javaexec读取输出
你好,我有一些关于java的问题。 这是我的密码:从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;
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]));
}