提要:我使用process是在用swftools转换pdf为swf文件时处理它的出错流和输入流信息,不处理会一直堵塞,并具要开启两个独立线程来处理,不然照样堵塞。下面的例程就是这个转换的处理。
在API中对waitFor()方法的说明是:
waitFor()
导致当前线程等待,如有必要,一直要等到由该 Process
对象表示的进程已经终止。
但是如果我们在调用此方法时,如果不注意的话,很容易出现主线程阻塞,Process也挂起的情况。在调用waitFor() 的时候,Process需要向主线程汇报运行状况,所以要注意清空缓存区,即InputStream和ErrorStream,在网上,很多只提到处理InputStream,忽略了ErrorStream。以下一段代码,贴出来,仅做参考。
package com.bolue.study;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.List;
public class ChangeSwf implements Runnable {
public void run() {
String PATH_TO_SWF="D:\\Program Files\\SWFTools\\pdf2swf.exe";
String fromFilename="G:\\test\\read\\suanfa.pdf";
String saveFilename="G:\\test\\read\\xiaoxiaoxxx.swf";
List<String> commend = new java.util.ArrayList<String>();
commend.add(PATH_TO_SWF);
commend.add("-o");
commend.add(saveFilename);
commend.add("-t");
commend.add(fromFilename);
commend.add("-s");
commend.add("languagedir="+"G:\\test\\read\\xpdf\\chinese-simplified");
ProcessBuilder builder = new ProcessBuilder();
builder.command(commend);
System.out.println("---转换1开始---");
try {
Process convertImgProcess = builder.start();
final InputStream is1 = convertImgProcess.getInputStream();
final InputStream is2 = convertImgProcess.getErrorStream();
new Thread() {
public void run() {
BufferedReader br = new BufferedReader(
new InputStreamReader(is1));
try {
String lineB = null;
while ((lineB = br.readLine()) != null ){
if(lineB != null)System.out.println(lineB);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}.start();
new Thread() {
public void run() {
BufferedReader br2 = new BufferedReader(
new InputStreamReader(is2));
try {
String lineC = null;
while ( (lineC = br2.readLine()) != null){
if(lineC != null)System.out.println(lineC);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}.start();
convertImgProcess.waitFor();
}catch (Exception e){
System.err.println(e);
}
System.out.println("---转换1结束---");
}
}