java如何运行OS命令(转)

简介: •javac TestRunTime.java•java TestRunTime hostname // 执行“hostname”Linux命令•即可看到输出   import java.

 

•javac TestRunTime.java
•java TestRunTime hostname // 执行“hostname”Linux命令
•即可看到输出

 

import java.io.IOException;
import java.io.InputStreamReader;
import java.io.LineNumberReader;

public class TestRunTime {
    public static void main(String[] args) throws IOException,
            InterruptedException {
        String cmd = "";
        if (args == null || args.length == 0) {
            System.out.println("请输入命令行参数");
        } else {
            for (int i = 0; i < args.length; i++) {
                cmd += args[i] + " ";
            }
        }
        try {
            Process process = Runtime.getRuntime().exec(cmd);
            InputStreamReader ir = new InputStreamReader(
                    process.getInputStream());
            LineNumberReader input = new LineNumberReader(ir);
            String line;
            while ((line = input.readLine()) != null) {
                System.out.println(line);
            }
        } catch (java.io.IOException e) {
            System.err.println("IOException " + e.getMessage());
        }
    }
}

http://www.cnblogs.com/alipayhutu/archive/2012/06/12/2546214.html



命令执行不成功时,可以将标准错误流的信息打印出来,发现是bat文件的路径只获取到了第一个空格前。所以问题的原因是空格导致文件路径不能被获取。

在正常情况下我们可以用Project.waitfor()的返回值是否等于0的方法来判断java调用外部程序是Pass或者是Fail。

但是这个方法往往会被因进程堵塞而导致程序发生死锁,无法再继续执行外部程序。

因为本地的系统对标准输入和输出所提供的缓冲池有限,所以错误的对标准输出快速的写入和从标准输入快速的读入都有可能造成子进程死锁。问题的关键在缓冲区这个地方:可执行程序的标准输出比较多,而运行窗口的标准缓冲区不够大,所以发生阻塞。接着来分析缓冲区,当Runtime对象调用exec(cmd)后,JVM会启动一个子进程,该进程会与JVM进程建立三个管道连接:标准输入,标准输出和标准错误流。假设该程序不断在向标准输出流和标准错误流写数据,而JVM不读取的话,当缓冲区满之后将无法继续写入数据,最终造成阻塞在waitfor()这里。

但是在其中过程中真正起关键作用的缓冲区是getErrorStream()对应的那个缓冲区没有被清空,意思就是说其实只要及时读取标准错误流缓冲区的数据程序就不会被block。

原先的代码

//run bat file

 Process project = Runtime.getRuntime().exec("cmd.exe /c " + batpath.replaceAll(" ", "\" \""));

 int exitcode=project.waitFor();

 //kill the process

     project.destroy();

            logger.info(exitcode);

            //if the exitcode is 0, the RIA TEST is passed,else the RIA TEST is failed    

            if(exitcode==0){

            logger.info("============ is Passed============");

                 }

            else{

            Boolean resultFlag=false;

            logger.info("============ is Failed============");

            Assert.assertTrue(bugID+"Failed",resultFlag);   

            }   

修改后的代码:

增加两个线程来读取标准输出流和标准错误流

try{

//run bat file

Process project = Runtime.getRuntime().exec("cmd.exe /c " + batpath.replaceAll(" ", "\" \""));

final InputStream br = project.getInputStream();

final InputStream br_error = project.getErrorStream();

//run 2 threads to read the standard InputStream and the ErrorStream to avoid the project.

//waitfor()method blocked
new Thread() {  
         public void run() {  
            BufferedReader br1 = new BufferedReader(new InputStreamReader(br));  
            try {  
             String line1 = null;  
             while ((line1 = br1.readLine()) != null) {  
                      if (line1 != null){
                          logger.info("RIATest info: "+line1);
                      }  
                  }  
            } catch (IOException e) {  
                 e.printStackTrace();  
            }  
             finally{  
                 try {  
                     br.close();  
                 } catch (IOException e) {  
                     e.printStackTrace();  
                }  
               }  
            }  
          }.start();  

//run thread to read the standard ErrorStream
 new Thread() {  
         public void run() {  
            BufferedReader br2 = new BufferedReader(new InputStreamReader(br_error));  
            try {  
             String line2 = null;  
             while ((line2 = br2.readLine()) != null) {  
                      if (line2 != null){
                          logger.info("Error: "+line2);
                      }  
                  }  
            } catch (IOException e) {  
                 e.printStackTrace();  
            }  
             finally{  
                 try {  
                     br_error.close();  
                 } catch (IOException e) {  
                     e.printStackTrace();  
                }  
               }  
            }  

          }.start();  
try{ int exitcode=project.waitFor(); //kill the process project.destroy(); logger.info(exitcode); //if the exitcode is 0, the RIA TEST is passed,
//else the RIA TEST is failed
    if(exitcode==0){
        logger.info("============ is Passed============");
    }
    else{
    Boolean resultFlag=false;
    logger.info("============ is Failed============");
    Assert.assertTrue(bugID+"Failed",resultFlag);   
    }   
}
catch(Throwable e){
    e.printStackTrace();
}       
}
catch(IOException e){
    e.printStackTrace();
    try
    {
        project.getErrorStream().close();
        project.getInputStream().close();
        project.getOutputStream().close();  
    }
    catch(Exception ee){
} }

http://www.cnblogs.com/xriverside/p/4362609.html

Java Runtime.getRuntime().exec() 执行带空格命令

可执行文件路径如果包含空格,则在java中不能被获取到。

此时Debug一下,会发现 project=null. project.waitFor 的返回值为1.但是去源路径单击bat文件是可以正常运行的,说明问题出在文件路径上。

将文件路径中的空格用双引号引起来就可以了

String batpath = file.getCanonicalPath() + "\\resources\\runTest.bat";
//run bat file
Process project = Runtime.getRuntime().exec("cmd.exe /c " + batpath);
int exitcode=project.waitFor();
//kill the process
project.destroy();
logger.info(exitcode);

 修改后的代码

//run bat file
Process project = Runtime.getRuntime().exec("cmd.exe /c " + batpath.replaceAll("[\\d]{1,}", "\" \""));

http://www.cnblogs.com/xriverside/p/4362541.html

 

相关文章
|
2月前
|
Java
Java关键字 —— super 详细解释!一看就懂 有代码实例运行!
文章详细解释了Java关键字`super`的用途,包括访问父类的成员变量、调用父类的构造方法和方法,并提供了相应的代码实例。
178 5
Java关键字 —— super 详细解释!一看就懂 有代码实例运行!
|
2月前
|
Java Apache Maven
Java百项管理之新闻管理系统 熟悉java语法——大学生作业 有源码!!!可运行!!!
文章提供了使用Apache POI库在Java中创建和读取Excel文件的详细代码示例,包括写入数据到Excel和从Excel读取数据的方法。
65 6
Java百项管理之新闻管理系统 熟悉java语法——大学生作业 有源码!!!可运行!!!
|
2月前
|
设计模式 算法 安全
实时操作系统(RTOS)深度解析及Java实现初探
【10月更文挑战第22天】实时操作系统(RTOS,Real-Time Operating System)是一种能够在严格的时间限制内响应外部事件并处理任务的操作系统。它以其高效、高速、可靠的特点,广泛应用于工业自动化、航空航天、医疗设备、交通控制等领域。本文将深入浅出地介绍RTOS的相关概念、底层原理、作用与功能,并探讨在Java中实现实时系统的方法。
99 1
|
1月前
|
Java Shell Windows
java Runtime.exec()执行shell/cmd命令:常见的几种陷阱与一种完善实现
java Runtime.exec()执行shell/cmd命令:常见的几种陷阱与一种完善实现
44 1
|
2月前
|
分布式计算 大数据 Java
大数据-86 Spark 集群 WordCount 用 Scala & Java 调用Spark 编译并打包上传运行 梦开始的地方
大数据-86 Spark 集群 WordCount 用 Scala & Java 调用Spark 编译并打包上传运行 梦开始的地方
42 1
大数据-86 Spark 集群 WordCount 用 Scala & Java 调用Spark 编译并打包上传运行 梦开始的地方
|
2月前
|
Java Windows
JAVA 常用的 DOS 命令
【10月更文挑战第15天】DOS 命令是 Java 开发中不可或缺的工具,掌握这些命令可以提高开发效率和操作便利性。
44 3
|
2月前
|
IDE Java 编译器
Java:如何确定编译和运行时类路径是否一致
类路径(Classpath)是JVM用于查找类文件的路径列表,对编译和运行Java程序至关重要。编译时通过`javac -classpath`指定,运行时通过`java -classpath`指定。IDE如Eclipse和IntelliJ IDEA也提供界面管理类路径。确保编译和运行时类路径一致,特别是外部库和项目内部类的路径设置。
195 5
|
3月前
|
移动开发 Android开发 数据安全/隐私保护
移动应用与系统的技术演进:从开发到操作系统的全景解析随着智能手机和平板电脑的普及,移动应用(App)已成为人们日常生活中不可或缺的一部分。无论是社交、娱乐、购物还是办公,移动应用都扮演着重要的角色。而支撑这些应用运行的,正是功能强大且复杂的移动操作系统。本文将深入探讨移动应用的开发过程及其背后的操作系统机制,揭示这一领域的技术演进。
本文旨在提供关于移动应用与系统技术的全面概述,涵盖移动应用的开发生命周期、主要移动操作系统的特点以及它们之间的竞争关系。我们将探讨如何高效地开发移动应用,并分析iOS和Android两大主流操作系统的技术优势与局限。同时,本文还将讨论跨平台解决方案的兴起及其对移动开发领域的影响。通过这篇技术性文章,读者将获得对移动应用开发及操作系统深层理解的钥匙。
107 12
|
2月前
|
运维 监控 Java
使用jps命令查看Java进程
`jps`是Java开发者和系统管理员的得力助手,它简化了Java进程监控的过程,使得快速检查应用运行状态变得轻而易举。通过合理利用其提供的参数,可以高效地进行故障排查、性能监控及日常管理任务,确保Java应用稳定运行。
108 2
|
2月前
|
Java
Java关键字 —— super 与 this 详细解释!一看就懂 有代码实例运行!
本文介绍了Java中this和super关键字的用法,包括在构造方法中使用this来区分参数和成员变量、使用super调用父类构造方法和方法,以及它们在同一个方法中同时使用的场景。
155 0
Java关键字 —— super 与 this 详细解释!一看就懂 有代码实例运行!