Process 和 ProcessBuilder 区别

前段时间在开发Android项目当中,发现需要更改文件权限,所以接触了Linux的一些文件权限问题。
Android系统中,在data/data/包名/  这个路径下的文件是只有 可写可读 的权限,但是没有 可执行 的权限。
(关于权限的问题可以百度一下查看这方面的技术点)
下面是我项目中所使用到有关于更改文件权限的代码


第一段是我原本所使用的,原理上是没有什么问题。
  1. /**
  2. *  修改文件权限
  3. * @param file
  4. */
  5. public static void chmod(File file) {
  6.     try {
  7.         String command = "chmod 777 " + file.getAbsolutePath();
  8.         Runtime runtime = Runtime.getRuntime();
  9.         Process process = runtime.exec(command);
  10.         process.destroy();
  11.     } catch (Throwable e) {
  12.        e.printStackTrace();
  13.     }
  14. }
复制代码


但是就是在调用到这段代码的时候,我发现我要准备修改权限的文件总是不能成功修改权限。        
可是断点调试的时候,这段代码都有被执行到。
奇怪的是,有时候可以成功,有时候不可以成功?!这个才是问题的关键。
........


后来在 @祝福   大神的帮助下,总算是解决了这个问题
改完之后代码是这样的:
  1. /**
  2. *  修改文件权限
  3. * @param file
  4. */
  5. public static void chmod(File file) {
  6.      try { 
  7.          String[] command = {"chmod", "777", file.getPath()};  
  8.          ProcessBuilder builder = new ProcessBuilder(command); 
  9.          builder.start();  
  10.      } catch (IOException e) { 
  11.         e.printStackTrace();  
  12.      }
  13. }
复制代码

原来是,Process 创建一条新的线程去执行任务,但创建进程的方法可能无法针对某些本机平台上的特定进程很好地工作。
但是ProcessBuilder 是一个final类,用于创建操作系统进程。每个 ProcessBuilder 实例管理一个进程属性集。
1)start() 方法利用这些属性创建一个新的 Process 实例。
2)start() 方法可以从同一实例重复调用,以利用相同的或相关的属性创建新的子进程
问题就是出现在这里,运行过程中Process 由于某种愿意导致无法正常更改文件权限。


一般来说,手机中资源有限,尽量少创建新的线程。
Handler、AsyncTask等等,这些都是Android封装好了的线程类,使用这些的话,可以有效减少因为线程而产生异常。

虽然是已经封装好了线程类,但是也尽量采用 单例模式实例化线程 或 线程的实例 来执行任务。

本文由上海java培训机构推荐阅读,更多精彩请浏览上海it培训官网。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值