java实现shell命令--小程序(通过Runtime和Process实现)

本文介绍了一个使用Java编写的程序,该程序通过Runtime类执行shell命令来列出指定目录的内容。文章详细展示了如何通过Runtime.getRuntime().exec()方法启动一个本地进程,并读取其输出。

先上代码(功能是要列出目录):

package testProcess;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.LineNumberReader;

public class testProcessBuilder {  
       
        public static Object exec(String cmd) {  
            try {  
                String[] cmdA = { "/bin/sh", "-c", cmd };  
                Process process = Runtime.getRuntime().exec(cmdA);
                
                BufferedReader br = new BufferedReader(new InputStreamReader(  
                        process.getInputStream()));  
          /*      LineNumberReader br = new LineNumberReader(new InputStreamReader(  
                        process.getInputStream()));*/  
                StringBuffer sb = new StringBuffer();  
                String line;  
                int i=0;
             while ((line = br.readLine()) != null) {  
                    sb.append("["+(i++)+"]"+line).append("\n");  
                }  
                return sb.toString();  
            } catch (Exception e) {  
                e.printStackTrace();  
            }  
            return null;  
        }  
       
        public static void main(String[] args) {  
            // TODO Auto-generated method stub  
            String netsString = exec("cd ~/testDirectory \r\n ls").toString();   
            System.out.println("==========列出目录=============");  
            System.out.println(netsString);  
        }  
       
    } 



输出:

==========列出目录=============
[0]360度摄像
[1]A107开发包
[2]adt-bundle-linux-x86_64-20140321
[3]adt-bundle-linux-x86_64-20140321.zip
[4]browserDown
[5]deveEn
[6]project
[7]smart


当不写"/bin/sh", "-c"时,控制台报如下错误:

java.io.IOException: Cannot run program "cd ~/testDirectory
 ls": error=2, 没有那个文件或目录
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1047)
    at java.lang.Runtime.exec(Runtime.java:617)
    at java.lang.Runtime.exec(Runtime.java:485)
    at testProcess.testProcessBuilder.exec(testProcessBuilder.java:12)
    at testProcess.testProcessBuilder.main(testProcessBuilder.java:34)
Caused by: java.io.IOException: error=2, 没有那个文件或目录
    at java.lang.UNIXProcess.forkAndExec(Native Method)
    at java.lang.UNIXProcess.<init>(UNIXProcess.java:186)
    at java.lang.ProcessImpl.start(ProcessImpl.java:130)
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1028)
    ... 4 more
Exception in thread "main" java.lang.NullPointerException
    at testProcess.testProcessBuilder.main(testProcessBuilder.java:34)

原因如下:

#!/bin/bash 以bash shell来解释(linux平台用到shell命令时)

其他:

#!/bin/csh 以csh shell来解释
#!/usr/bin/env python 以下代码由python来解释


简单介绍下Runtime和Process:

 Runtime类封装了运行时的环境。
每个 Java 应用程序都有一个 Runtime 类实例,使应用程序能够与其运行的环境相连接。
一般不能实例化一个Runtime对象,应用程序也不能创建自己的 Runtime实例,
但可以通过 getRuntime 方法获取当前Runtime运行时对象的引用。
一旦得到了一个当前的Runtime对象的引用,就可以调用Runtime对象的方法
去控制Java虚拟机的状态和行为。

java.lang.Runtime.getRuntime() 方法返回与当前的Java应用程序的运行时对象。
此方法返回与当前的Java应用相关的运行时对象。
Runtime类的方法是实例方法,就必须调用当前运行时对象.Runtime.exec()方法可以创建一个本地进程,
并返回Process子类的一个实例。

Process类是一个抽象类,其内部所有的方法都是抽象的。主要作用是创建一个可以管理的进程,并对它进行管理。
该类提供进程的输入、执行输出到进程、等待进程的完成和检查进程的退出状态及销毁进程的方法。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值