Java 调用可执行文件
1. 环境
- Java 8;
- Windows 11;
- Ubuntu 20.04;
2. 代码
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
/**
* 外部可执行文件调用测试.
*
* @author <a href="mailto:xiaoQQya@126.com">xiaoQQya</a>
* @since 2023/04/14
*/
class Test{
public static void main(String[] args) throws IOException {
// 需要执行的命令
String[] cmds = {
"cmd.exe", "/c",
"ping",
"-n", "4",
"www.baidu.com"
};
// 创建进程
ProcessBuilder pb = new ProcessBuilder(cmds);
// 启动进程
Process process = pb.start();
// 获取标准输出与错误输出
try (
InputStream stdout = process.getInputStream();
InputStream errout = process.getErrorStream()
) {
String line;
BufferedReader stdReader = new BufferedReader(new InputStreamReader(stdout, "GBK"));
BufferedReader errReader = new BufferedReader(new InputStreamReader(errout, "GBK"));
while (process.isAlive() || stdReader.ready() || errReader.ready()) {
if (stdReader.ready() && (line = stdReader.readLine()) != null) {
System.out.println("Std output: " + line);
}
// 此处必须读取错误输出,否则会导致缓冲区占满无法获取到标准输出
if (errReader.ready() && (line = errReader.readLine()) != null) {
System.err.println("Error output: " + line);
}
}
}
}
}
3. 其它
-
设置工作目录;
// 设置进程工作目录 pb.directory(Paths.get(System.getProperty("user.dir")).toFile());
-
向进程输入数据;
try ( OutputStream stdin = process.getOutputStream(); ) { stdin.write("\n".getBytes(StandardCharsets.UTF_8)); stdin.flush(); }
-
读取二进制输出;
try ( InputStream stdout = process.getInputStream(); InputStream errout = process.getErrorStream() ) { String line; int size; byte[] buffer = new byte[1024]; BufferedReader stdReader = new BufferedReader(new InputStreamReader(stdout, "GBK")); BufferedReader errReader = new BufferedReader(new InputStreamReader(errout, "GBK")); while (process.isAlive() || stdReader.ready() || errReader.ready()) { if (stdReader.ready() && (size = stdout.read(buffer)) != -1) { byte[] wrap = new byte[size]; System.arraycopy(buffer, 0, wrap, 0, size); System.out.println("Std output: " + Arrays.toString(wrap)); } // 此处必须读取错误输出,否则会导致缓冲区占满无法获取到标准输出 if (errReader.ready() && (line = errReader.readLine()) != null) { System.err.println("Error output: " + line); } } }