java执行bat命令碰到的阻塞问题的解决方法_java

使用Java来执行bat命令,如果bat操作时间过长,有可能导致阻塞问题,而且不会执行bat直到关闭服务器。
如:

复制代码 代码如下:

Runtime r=Runtime.getRuntime(); 
        Process p=null; 
        try{ 
            String path = "D:/test.bat"; 
     p = r.exec("cmd.exe /c  "+path); 
     p.waitFor(); 
 }catch(Exception e){  
     System.out.println("运行错误:"+e.getMessage()); 
     e.printStackTrace();  

一般java的exec是没有帮你处理线程阻塞问题的,需要手动处理。
处理后:

复制代码 代码如下:

Runtime r=Runtime.getRuntime(); 
        Process p=null; 
        try{ 
            String path = "D:/test.bat"; 
     p = r.exec("cmd.exe /c  "+path); 
     StreamGobbler errorGobbler = new StreamGobbler(p.getErrorStream(), "ERROR");          
            errorGobbler.start(); 
            StreamGobbler outGobbler = new StreamGobbler(p.getInputStream(), "STDOUT"); 
            outGobbler.start(); 
     p.waitFor(); 
    }catch(Exception e){  
            System.out.println("运行错误:"+e.getMessage()); 
            e.printStackTrace();  
   } 

StreamGobbler 类如下:

复制代码 代码如下:

package com.test.tool; 

 
import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.io.OutputStream; 
import java.io.PrintWriter; 

 
/**
 * 用于处理Runtime.getRuntime().exec产生的错误流及输出流
 */ 
public class StreamGobbler extends Thread { 
    InputStream is; 
    String type; 
    OutputStream os; 

    StreamGobbler(InputStream is, String type) { 
        this(is, type, null); 
    } 

    StreamGobbler(InputStream is, String type, OutputStream redirect) { 
        this.is = is; 
        this.type = type; 
        this.os = redirect; 
    } 

    public void run() { 
        InputStreamReader isr = null; 
        BufferedReader br = null; 
        PrintWriter pw = null; 
        try { 
            if (os != null) 
                pw = new PrintWriter(os); 

            isr = new InputStreamReader(is); 
            br = new BufferedReader(isr); 
            String line=null; 
            while ( (line = br.readLine()) != null) { 
                if (pw != null) 
                    pw.println(line); 
                System.out.println(type + ">" + line);     
            } 

            if (pw != null) 
                pw.flush(); 
        } catch (IOException ioe) { 
            ioe.printStackTrace();   
        } finally{ 
            try { 
                pw.close(); 
                br.close(); 
                isr.close(); 
            } catch (IOException e) { 
                e.printStackTrace(); 
            } 
        } 
    } 
}  

运行bat,就不会阻塞了。

时间: 2024-12-03 01:03:57

java执行bat命令碰到的阻塞问题的解决方法_java的相关文章

Java读取properties配置文件时,出现中文乱码的解决方法_java

如下所示: public static String getConfig(String key) { Properties pros = new Properties(); String value = ""; try { pros.load(new InputStreamReader(Object.class.getResourceAsStream("/properties.properties"), "UTF-8")); value = pr

dos里执行tracert命令只有一跳的原因及解决方法_DOS/BAT

一直以来,我在家电脑DOS里执行Tracert命令时都只看到只有一跳的返回结果,令我非常不解.我原以为是电信运营商那边的问题,所以也就一直没去追究是什么真正的原因. C:\Documents and Settings\Administrator>tracert www.baidu.com Tracing route to www.a.shifen.com [220.181.111.148]over a maximum of 30 hops:   1     45 ms    46ms    46

java 执行外部命令,想要得到按时间顺序正确的完整的打印信息,并且能阻塞,有什么办法呢?

问题描述 java 执行外部命令,想要得到按时间顺序正确的完整的打印信息,并且能阻塞,有什么办法呢? Process p = Runtime.getRuntime().exec(commands); 打印信息是分开普通信息缓冲区和错误信息缓冲区的,2者分开后,就体现不了顺序关系了,比如第一行错误信息,是在哪个普通信息之后打印的,第二行错误信息是在第几行普通信息之后打印的,如果使用 > xx.log的方式,可以得到顺序正确的打印文件,但是就不能用java.lang.Process阻塞了,会直接往下

java执行Linux命令的方法_java

本文实例讲述了java执行Linux命令的方法.分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: public class StreamGobbler extends Thread {            InputStream is;      String type;        public StreamGobbler(InputStream is, String type) {          this.is = is;          this.type = ty

关于java执行ubuntu命令的问题

问题描述 关于java执行ubuntu命令的问题 同志们好,我在java代码中这样写的: public class LinuxTest { public static void main(String[] args) { LinuxTest test = new LinuxTest(); test.chmod("/usr/java/apache-tomcat-7.0.62/webapps/UploadSpringMVC/upload/tlbbtestfile.txt"); } /**

java 执行linux命令判断某个文件是否存在

问题描述 java 执行linux命令判断某个文件是否存在 java用sshxcute 连接linux服务器,判断一个某个路径下的某个文件或文件夹是否存在? 给出返回值. 解决方案 http://www.cnblogs.com/emanlee/p/3583769.html

java执行shell命令-Java执行shell命令问题

问题描述 Java执行shell命令问题 我在java代码中执行shell命令改变Android目录下的文件123.sh的权限, 使用Runtime.getRuntime().exec("chmod 777 /data/misc/123.sh")这个命令无效, 但是,我将chmod 777 /data/misc/123.sh这个命令写到脚本chmod.sh里,在PC机上改变chmod.sh的权限后使用adb push将其放到android目录/data/misc/下, 再使用Runti

javaweb-java根据ip判断网络连接情况(i除Java执行ping命令和InetAddress这两种方式)

问题描述 java根据ip判断网络连接情况(i除Java执行ping命令和InetAddress这两种方式) 因为ava执行ping命令和InetAddress这两种方式执行速度太慢了,有没有更好的解决方法??? 解决方案 获得客户端真实IP地址的方法一: public String getRemortIP(HttpServletRequest request) { if (request.getHeader("x-forwarded-for") == null) { return r

java执行Linux命令的问题

问题描述 我java执行Linux命令使用的是ganymed-ssh2-build工具包,Linux命令输出结果比较短的时候没有问题,在Linux环境下面如果输出结果行数比较多,超过了一定行数的时候,会显示"----------more-------------"字样,然后输入空格或者回车,会继续展示余下的文本结果.现在我不知道怎么取"----------more-------------"这行值,然后接下来如何取得后面剩余的文本结果.请各位大神帮帮忙,谢了,在线等