博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java使用Runtime.exec()运行windwos dos或linux shell命令
阅读量:5735 次
发布时间:2019-06-18

本文共 4016 字,大约阅读时间需要 13 分钟。

使用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命令

转载地址:http://ghrwx.baihongyu.com/

你可能感兴趣的文章
分布式搜索的面试题4
查看>>
SQL Server 高级操作 视图和存储过程
查看>>
springboot 发布
查看>>
浅析Java开发模式—Model1、Model2和三层
查看>>
[C++基础]在构造函数内部调用构造函数
查看>>
EF-CodeFirst-数据迁移
查看>>
Oracle 12c RAC 搭建手册
查看>>
[BeiJing wc2012]连连看(建模,最小费用最大流)
查看>>
六.事务
查看>>
IO流之字符流-1
查看>>
Hdu-6230 2017CCPC-哈尔滨站 A.Palindrome Manacher 主席树
查看>>
Gym-101915C Shahhoud Training Hussain 模拟
查看>>
Cloud BOS平台-自定义用户联系对象
查看>>
管理表空间和数据文件——数据库逻辑结构
查看>>
少走弯路去学习面向对象编程
查看>>
2019-4-26 css学习笔记
查看>>
zabbix开源监控。
查看>>
BZOJ4195 NOI2015 程序自动分析
查看>>
正则表达式去除连续重复的字符
查看>>
安装LR11 时,安装Microsoft Visual c++2005 sp1运行时组件,就会提示命令行选项语法错误,键入“命令/?”可获取帮肋信息...
查看>>