📅  最后修改于: 2023-12-03 14:57:17.641000             🧑  作者: Mango
在Java程序中,有时候需要将某个值输出到另一个脚本中进行处理或操作,如何获取这个值呢?下面将介绍两种方法。
使用Runtime.exec()方法可以在Java程序中调用命令行来执行外部命令,这样就可以将输出结果返回到Java程序中。
下面是示例代码:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
public class GetOutput {
public static void main(String[] args) {
try {
//要执行的命令
String command = "python test.py";
//获取Runtime对象
Runtime runtime = Runtime.getRuntime();
//执行命令并获取返回结果
Process process = runtime.exec(command);
InputStream is = process.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
String line;
while ((line = reader.readLine()) != null) {
System.out.println("输出结果:" + line);
}
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
上面的代码中,我们通过Runtime.getRuntime()方法获取Runtime对象,然后使用Runtime.exec()方法执行命令"python test.py",并将返回结果读取出来输出。
需要注意的是,Runtime.exec()方法是阻塞的,即程序会一直等待命令执行完毕才会继续往下执行。所以如果执行的命令比较耗时,应该将它放到单独的线程中执行,以免影响程序的执行。
ProcessBuilder类可以帮助我们创建一个进程,并提供进程的输入、输出和错误流。使用ProcessBuilder.start()方法可以启动一个进程,并返回Process对象,通过Process对象就可以获取命令执行的输出结果。
下面是示例代码:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
public class GetOutput {
public static void main(String[] args) {
try {
//要执行的命令
List<String> commandList = new ArrayList<String>();
commandList.add("python");
commandList.add("test.py");
//获取ProcessBuilder对象
ProcessBuilder processBuilder = new ProcessBuilder(commandList);
//执行命令并获取返回结果
Process process = processBuilder.start();
InputStream is = process.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
String line;
while ((line = reader.readLine()) != null) {
System.out.println("输出结果:" + line);
}
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
上面的代码中,我们通过ProcessBuilder对象创建一个进程,在创建进程的时候设置进程要执行的命令,并使用ProcessBuilder.start()方法启动这个进程,最后通过Process对象获取命令执行的输出结果。
需要注意的是,ProcessBuilder会自动将参数转义,可以有效地避免命令注入攻击。并且ProcessBuilder允许我们在创建进程时设置进程的工作目录、环境变量等参数,这样可以更方便地控制进程的执行。