Runtime.getRuntime().exec 类 防止阻塞

import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.util.ArrayList;
import java.util.List;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.apache.log4j.Logger;
import org.richinfo.gather.driver.MainEntry;
//用两个线程来分别获取标准输出流和错误输出流,不然会形成io阻塞致使程序卡死
public class ShellExec {
	
	public static String execute(String cmd) throws IOException, InterruptedException {
		StringBuffer sb = new StringBuffer();
		
		final Process p = Runtime.getRuntime().exec(cmd);
	  
	    
	    /*为"错误输出流"单独开一个线程读取之,不然会形成标准输出流的阻塞*/  
        Thread t=new Thread(new InputStreamRunnable(p.getErrorStream(),"ErrorStream"));  
        t.start();  

	    BufferedReader reader = null;
	    InputStream output = p.getInputStream();
	    //InputStream error = p.getErrorStream(); 
	    String line = "";
	    
	    reader = new BufferedReader(new InputStreamReader(output));
	    while ((line = reader.readLine())!= null) {
	    		sb.append(line + "\n");
	    }
	    p.waitFor();
//	    if (0x00 == sb.length()) {
//	    	reader = new BufferedReader(new InputStreamReader(error));
//	    	
//	    	while ((line = reader.readLine())!= null) {
//	    		sb.append(line + "\n");
//		    }
//	    }
	    reader.close();
	    p.destroy();
	    return sb.toString();
	}
}
/**读取InputStream的线程*/  
class InputStreamRunnable implements Runnable  
{  
    BufferedReader bReader=null;  
    String type=null;  
    public InputStreamRunnable(InputStream is, String _type)  
    {  
        try  
        {  
            bReader=new BufferedReader(new InputStreamReader(new BufferedInputStream(is),"UTF-8"));  
            type=_type;  
        }  
        catch(Exception ex)  
        {  
        }  
    }  
    public void run()  
    {  
        String line;  
        int lineNum=0;  
  
        try  
        {  
            while((line=bReader.readLine())!=null)  
            {  
                lineNum++;  
                //Thread.sleep(200);  
            }  
            bReader.close();  
        }  
        catch(Exception ex)  
        {  
        }  
    }  
}  
相关文章
相关标签/搜索