java使用Runtime.exec()运行windwos dos或linux shell命令

使用Runtime.exec()运行windwos dos或linux shell命令,按实际情况具体测试
 
 
实例代码:
package  com.bookoo.test.command;
import  java.io.BufferedReader;
import  java.io.BufferedWriter;
import  java.io.IOException;
import  java.io.InputStreamReader;
import  java.io.OutputStreamWriter;
 
/**
  *
  *  @author  nathan
  */
public  class  TestLinuxCommand {
       public  static  void  main(String[] args) {
      String logDir = System.getProperty( "log.dir" );
      
      
       // windows "/c"参数一定要加上 打开窗口立即关闭,获取读写流不会报异常
      String commands =  "cmd.exe /c c: && dir" ;
      
       // linux
//          String commands = "ls -l";
//          String commands = "sh -c cd /data/log/daemon/bprocess && ls -lt";
//          String[] commands = new String[] {"/bin/sh", "-c", "/bin/ls -lt /data/log/daemon/bprocess"};
 
      
       /**
        *    测试1:用命令字符串数组运行函数执行多个命令 <br>
        *    运行流程:打开sh窗口 --> 执行pwd命令 --> over <br>
        *    结果运行只运行了第一个命令 <br>
        *    为什么了,经过测试发现,这个函数他根本就不用管有几个命令,只需要将这个数组组成一个字符串去运行,你数组的内容组成一条字符串是什么样,那运行结果就是什么样了(运行不了就报错误呗) <br>
        *    疑问:那这样的话,我如何运行多个命令了,查语法发现多个一起运行可以用"&&"符号,如:"dir  &&dir  d:&&  e:"(空格是没有关系的) <br>
        *    好,上面是dos运行的情况,现在再看linux <br>
        *    shell只是数组中的第一条字符串pwd运行了,后面一个命令没有运行,原理跟dos是一样的,组成一个字符串运行有问题,加"&&"符号隔开两个命令就ok了 <br>
        *    猜想:那好,如果只能运行一条字符串,那我不用数组了,看测试2
        */
       // windows dos
       // String[] commands = new String[] {"cmd.exe", "/c", "dir" ,"d:", "dir"};
       // String[] commands = new String[] {"cmd.exe", "/c", "dir" ,"&&d:&&", "dir"};
       // linux shell
       // 错误,还是只执行一个pwd命令,ls命令不执行,正确用法看测试2
       // String[] commands = new String[] {"/bin/sh", "-c", "pwd" , "/bin/ls"};
       // String[] commands = new String[] {"/bin/sh", "-c", "ls" , "&& pwd"};
      
      
       /**
        *  测试2:用命令字符串运行函数执行多个命令 <br>
        *  运行流程:打开sh窗口 --> 执行pwd命令 --> 执行ls命令 --> over <br>
        *  结果证明测试1结果猜想是正确的 <br>
        */
       // windwos dows
       // String commands = "cmd.exe /c dir && c: && dir";
       // linux shell
       // ls命令不执行,参数没效果
       // String commands = "sh -c pwd&&ls -lt";
       // 正确,ls参数没效果
       // String commands = "sh -c ls -lt&&pwd";
      
       /**
        *  测试3:不同环境下切换目录命令 <br>
        *  windows可行,linux不可行 <br>
        *  疑问:只要能够dos或者shell中测试的一整条命令,exec就能运行,但linux切换目录命令一加就不行 <br>
        */
       // windows
       // String commands = "cmd.exe /c dir && c: && dir";
       // linux
       // 错误
       // String commands = "sh -c pwd && cd /data/log/daemon/bprocess && ls -lt";
       // 正确,ls参数没生效
       // String commands = "sh -c ls -lt /data/log/daemon/bprocess && pwd";
       // 正确,ls参数生效,神奇吧,前面不用加sh一样能运行且这样运行ls参数生效,但是pwd命令用不了,原因没在schell环境中,单独运行加sh -c 就行了
       // String commands = "/bin/ls -lt /data/log/daemon/bprocess && pwd";
       // 错误
       // String[] commands = new String[] {"/bin/sh", "-c", "pwd" ,"cd /data/log/daemon/bprocess", "/bin/ls"};
      
       // 这样的话,schell环境下执行,我要想看哪个目录文件,就不能先切换过去在看了,命令写成这样:/bin/ls -lt /data/log/daemon/bprocess
       // dos也是一样的 dir c:
      
       /**
        *  最后 <br>
        *  cmd.exe=cmd(大写也行),sh=/bin/sh(schell命令都是在/bin目录下),操作结果都是一样的,不会报错 <br>
        *  /bin/sh这种写法执行为了调用更安全(直接告诉命令在哪,不要linux自己再去识别一下了,我是这样猜想的) <br>
        */
      java.lang.Process process =  null ;
       try
            {
            System. out .println( "exec commands success" );
            process = Runtime.getRuntime().exec(commands);
            InputStreamReader inputStream =  new  InputStreamReader(process.getInputStream());
            BufferedReader input =  new  BufferedReader(inputStream);
            String line;
            System. out .println( "print inputStream start" );
             while  ((line = input.readLine()) !=  null ){
                  System. out .println(line);
            }
            System. out .println( "print inputStream over" );
            
//                InputStreamReader errorStream = new InputStreamReader(process.getErrorStream());
//                input = new BufferedReader(errorStream);
//                System.out.println("print errorStream start");
//                while ((line = input.readLine()) != null){
//                      System.out.println(line);
//                      input.close();
//                }
//                System.out.println("print errorStream over");
            
//                OutputStreamWriter outputStream = new OutputStreamWriter(process.getOutputStream());
//                BufferedWriter writer = new BufferedWriter(outputStream);
//                System.out.println("print outputStream start");
//                writer.write("outputStream writer success");
//                writer.flush();
//                writer.close();
//                System.out.println("print outputStream over");
            }  catch  (IOException e)
            {
                  System. out .println( "have ioexception" );
                  e.printStackTrace();
            }  finally {
                   try
                  {
                        System. out .println(process.waitFor());
                  }  catch  (InterruptedException e)
                  {
                        e.printStackTrace();
                  }
            }
      }
}
 
 
 
 
搜索关键词:java 运行linux命令
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值