2023年11月29日发(作者:)

JavaProcessRuntime()的使⽤及调⽤cmd命令阻塞的

解决⽅案

Java ProcessRuntime()使⽤

java调⽤cmd执⾏bat⽂件有时会出现卡死的现象,当时感觉很迷惑,后来查资料,本来⼀般都是这样来调⽤程序并获取进程的

输出流的,但是我在windows上执⾏这样的调⽤的时候却总是在while那⾥被堵塞了,结果造成ffmpeg程序在执⾏了⼀会后不再

执⾏,这⾥从官⽅的参考⽂档中我们可以看到这是由于缓冲区的问题,由于java进程没有清空ffmpeg程序写到缓冲区的内容,

结果导致ffmpeg程序⼀直在等待。

在⽹上也查找了很多这样的问题,不过说的都是使⽤单独的线程来进⾏控制,我也尝试过很多⽹是所说的⽅法,可⼀直没起什

么作⽤。

⼀直认为是getInputStream的缓冲区没有被清空,不过问题确实是缓冲区的内容没有被清空,但不是getInputStream的,⽽是

getErrorStream的缓冲区,这样问题就得到解决了。

所以我们在遇到java调⽤外部程序⽽导致线程阻塞的时候,可以考虑使⽤两个线程来同时清空process获取的两个输⼊流,如下

这段程序:

public String excuteBatFile(String file, boolean isCloseWindow)

{

String cmdCommand = null;

String res = null;

if(isCloseWindow)

{

cmdCommand = " /c " + file;

}else

{

cmdCommand = " /k " + file;

}

StringBuilder stringBuilder = new StringBuilder();

Process process = null;

try {

process = time().exec(cmdCommand);

final InputStream is1 = utStream();

new Thread(new Runnable() {

public void run() {

BufferedReader bufferedReader = null;

String line = null;

try {

bufferedReader = new BufferedReader(

new InputStreamReader(is1, "GBK"));

while((line=ne()) != null)

{

(line+"n");

}

();

} catch (Exception e) {

// TODO Auto-generated catch block

tackTrace();

}

java Process执⾏cmd命令流阻塞处理

代码如下:

public static void runCmd() {

Process process = null;

BufferedReader bufferedReader = null;

try {

ger().info("============= 开始重启机器 =============");

process = time().exec(" /c shutdown -r -f -t 0");

bufferedReader = new BufferedReader(new InputStreamReader(new BufferedInputStream(utStream()), e("GB2312")));

// 开启线程读取错误输出,避免阻塞

以上为个⼈经验,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。