Runtime.getRunTime.exec(String command)的使用

原文链接 http://blog.csdn.net/zmyde2010/archive/2011/01/08/6123987.aspx

Android: 通过Runtime.getRuntime().exec调用底层Linux下的程序或脚本收藏 
Android Runtime使得直接调用底层Linux下的可执行程序或脚本成为可能

比如Linux下写个测试工具,直接编译后apk中通过Runtime来调用

或者写个脚本,apk中直接调用,省去中间层或者JNI

这个至少效率应该比较高吧

 

代码:

view plaincopy toclipboardprint?
public class test extends Activity{   
    TextViewtext;   
       
     
   @Override  
    public voidonCreate(Bundle savedInstanceState){   
       super.onCreate(savedInstanceState);   
       setContentView(R.layout.main);   
           
       text = (TextView)findViewById(R.id.text);   
           
       Button btn_ls = (Button)findViewById(R.id.btn_ls);   
       btn_ls.setOnClickListener(new OnClickListener(){   
           public void onClick(View v){                  
               do_exec("ls/mnt/sdcard");   
                        
       });   
       Button btn_cat = (Button)findViewById(R.id.btn_cat);   
       btn_cat.setOnClickListener(new OnClickListener(){   
           public void onClick(View v){                  
               do_exec("cat/proc/version");   
                        
       });           
       Button btn_rm = (Button)findViewById(R.id.btn_rm);   
       btn_rm.setOnClickListener(new OnClickListener(){   
           public void onClick(View v){                  
               do_exec("rm/mnt/sdcard/1.jpg");   
                        
       });       
       Button btn_sh = (Button)findViewById(R.id.btn_sh);   
       btn_sh.setOnClickListener(new OnClickListener(){   
           public void onClick(View v){                  
               do_exec("/system/bin/sh /mnt/sdcard/test.sh123");   
                        
       });            
     
       
    Stringdo_exec(String cmd){   
       String s ="\n";   
       try{   
           Process p =Runtime.getRuntime().exec(cmd);   
           BufferedReader in = newBufferedReader(   
                               newInputStreamReader(p.getInputStream()));   
           String line =null;   
           while ((line = in.readLine()) != null){   
               s += line +"\n";                  
             
       } catch (IOException e){   
           // TODO Auto-generated catchblock   
           e.printStackTrace();   
         
       text.setText(s);   
       returncmd;        
     
 
public class test extends Activity {
 TextView text;
 
   
   @Override
    public voidonCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.main);
        
       text = (TextView) findViewById(R.id.text);
        
       Button btn_ls = (Button) findViewById(R.id.btn_ls);
       btn_ls.setOnClickListener(new OnClickListener() {
   public voidonClick(View v){    
    do_exec("ls/mnt/sdcard");
          
       });
       Button btn_cat = (Button) findViewById(R.id.btn_cat);
       btn_cat.setOnClickListener(new OnClickListener() {
   public voidonClick(View v){    
    do_exec("cat/proc/version");
          
       });        
       Button btn_rm = (Button) findViewById(R.id.btn_rm);
       btn_rm.setOnClickListener(new OnClickListener() {
   public voidonClick(View v){    
    do_exec("rm/mnt/sdcard/1.jpg");
          
       });    
       Button btn_sh = (Button) findViewById(R.id.btn_sh);
       btn_sh.setOnClickListener(new OnClickListener() {
   public voidonClick(View v){    
    do_exec("/system/bin/sh/mnt/sdcard/test.sh 123");
          
       });         
    }
    
    Stringdo_exec(String cmd) {
    String s = "\n";
    try {
   Process p =Runtime.getRuntime().exec(cmd);
   BufferedReaderin = new BufferedReader(
        newInputStreamReader(p.getInputStream()));
   String line =null;
   while ((line= in.readLine()) != null) {
    s+= line +"\n";    
   }
  } catch (IOException e){
   // TODOAuto-generated catch block
   e.printStackTrace();
  }
    text.setText(s);
  returncmd;    
    }
}

test.sh:

echo test.sh
echo $1

需要注意:

1. exec不等于console命令

2. exec的输入输出流需要自己处理

3. exec执行时阻塞、非阻塞,返回结果问题

4. 注意权限问题

有个文章讲的比较深入,贴出来研究:

http://blog.csdn.net/zmyde2010/archive/2011/01/12/6130895.aspx

http://kuangbaoxu.javaeye.com/blog/210291

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/zmyde2010/archive/2011/01/08/6123987.aspx


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
`Runtime.getRuntime().exec()`是Java中用于执行外部进程的方法。它返回一个Process对象,可以使用这个对象控制和监视进程的执行。 语法如下: ```java public Process exec(String command) throws IOException ``` 其中,command是要执行的命令。 例如,执行一个简单的命令: ```java Process process = Runtime.getRuntime().exec("ls"); ``` 这个代码将在当前目录下执行`ls`命令,并返回一个Process对象。 然而,这只是一个简单的例子。实际上,在执行外部进程时,还需要考虑很多其他方面,例如进程的输入、输出、错误处理等。 下面是一个更复杂的例子,演示如何使用`Runtime.getRuntime().exec()`执行一个Python脚本,并读取它的输出: ```java try { Process process = Runtime.getRuntime().exec("python myscript.py"); BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())); String line; while ((line = reader.readLine()) != null) { System.out.println(line); } } catch (IOException e) { e.printStackTrace(); } ``` 在这个例子中,我们使用`BufferedReader`读取进程的输出,并将其打印到控制台上。如果进程执行时发生错误,我们可以使用`process.getErrorStream()`方法获取错误流,并对其进行处理。 需要注意的是,`Runtime.getRuntime().exec()`方法在执行外部进程时可能会阻塞当前线程,因此在处理输出时需要开启一个新的线程。此外,还需要注意处理输入、输出、错误流的顺序,以避免死锁等问题。 总之,`Runtime.getRuntime().exec()`是一个非常强大的方法,可以在Java中轻松地执行外部命令和脚本。但是,它需要仔细处理各种输入、输出、错误流,以确保进程能够正确执行。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值