Android执行执行Shell命令总结

开发中有时需要用Java调用系统的一些命令,执行一些语言本事不具备的功能,Android开发中最常见的就是Root静默安装,通过命令修改某些目录权限等工作。我们通常会通过Runtime执行一个系统命令,返回一个process对象,然后检查这个对象的状态,了解执行结果。JavaSE调用shell命令原理也类似。

下面我们看个实例

Process process;
String cmd = "chmod 777 " + f.getAbsolutePath();
process = Runtime.getRuntime().exec(cmd);
process.waitFor();
到此为止,是不是就结束了呢,其实不然。调用exec会创建一个子进程来执行这个命令,如果命令输出的信息过多,会导致子进程的缓冲区被占满,命令无法进行执行下去。有兴趣可以试下。这时我们需要在调用waitFor之前将process的缓冲数据给消费掉。可以用下面的方法进行处理。
/**
	 * discard all stream
	 */
	private static void consumeStream(InputStream is) {
		BufferedReader br = new BufferedReader(new InputStreamReader(is)); 
        try {
        	String str = null;
			while((str = br.readLine()) != null) {
				
				Log.v(TAG, str);
				
			}
			if (is != null) {
				is.close();
			}
		} catch (IOException e) {
			Log.v(TAG, "" + e);
		}
	}

类似的问题已经转的满地都是,但是实际运用中却总有人布好好多坑。。

具体可以参考这里http://stackoverflow.com/questions/5483830/process-waitfor-never-returns
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值