当前位置: 首页 > news >正文

东莞市永铭装饰有限公司/搜索引擎优化服务公司哪家好

东莞市永铭装饰有限公司,搜索引擎优化服务公司哪家好,内蒙古自治区住房和城乡建设厅官网,站长之家alexa排名一、前言                                 Java虽然五脏俱全但总有软肋,譬如获取CPU等硬件信息,当然我们可以通过JNI调用C/C来获取,但对于对C/C和Windows API不熟的码农是一系列复杂的学习和踩坑过程。那能…

一、前言                                

 Java虽然五脏俱全但总有软肋,譬如获取CPU等硬件信息,当然我们可以通过JNI调用C/C++来获取,但对于对C/C++和Windows API不熟的码农是一系列复杂的学习和踩坑过程。那能不能通过简单一些、学习成本低一些的方式呢?答案是肯定的,在功能实现放在首位的情况下,借他山之石是最简洁有力的做法。而 Runtime.exec方法 就为我们打开这么的一条路了。

 

二、认识 java.lang.Runtime.exec方法  

  作用:用于调用外部程序,并重定向外部程序的标准输入、标准输出和标准错误到缓冲池。功能就是和windows的“运行”一样啦。

  

  方法重载:

    1、  exec(String command) ,调用外部程序,入参command为外部可执行程序的启动路径或命令。

    2、  exec(String[] cmdArray) ,调用外部程序,入参cmdArray的元素将组合成为一条完整的外部可执行程序的启动路径或命令。

    3、  exec(String command, String[] envp) ,在调用外部程序之前设置系统环境变量,该变量仅供command入参使用,envp每个元素为一个系统环境变量,并且字符串格式为“环境变量名=环境变量值”。

    4、  exec(String command, String[] envp, File dir) , 除了设置系统环境变量外,还通过入参dir设置当前工作目录。

  实例 —— 在当前目录执行dir命令,并将结果保存到c:\dir.txt文本文件中:

  前提:假设当前用户的家目录为c:\user\fsjohnhuang

  c:\user\fsjohnhuang下的目录结构

c:\user\fsjohnhuang 
|--jottings 
|--test.txt

  d:\test下的目录结构

d:\test
|--movies
|--readme.txt

  代码片段

Runtime r = Runtime.getRuntime();
try{Process proc = r.exec("cmd /c dir > %dest%", new String[]{"dest=c:\\dir.txt", new File("d:\\test")});int exitVal = proc.waitFor(); // 阻塞当前线程,并等待外部程序中止后获取结果码System.out.println(exitVal == 0 ? "成功" : "失败");
}
catch(Exception e){e.printStackTrace();
}


  执行代码后查看c:\dir.txt文件内容如如下:

驱动器 D 中的卷没有标签。卷的序列号是 8074-B214D:\test 的目录2014/09/22  14:45    <DIR>          movies
2014/03/31  17:14             8,642 readme.txt



三、注意点    

  1.  Runtime.exec() 不是cmd或shell环境,因此无法直接调用dir等命令。若要调用命令行下的命令,请参考第2节的实例。

  2.  通过 Process实例.getInputStream() 和 Process实例.getErrorStream() 获取的输入流和错误信息流是缓冲池向当前Java程序提供的,而不是直接获取外部程序的标准输出流和标准错误流。

  

   而缓冲池的容量是一定的,因此若外部程序在运行过程中不断向缓冲池输出内容,当缓冲池填满,那么外部程序将暂停运行直到缓冲池有空位可接收外部程序的输出内容为止。(采用xcopy命令复制大量文件时将会出现该问题)

   解决办法就是当前的Java程序不断读取缓冲池的内容,从而为腾出缓冲池的空间。

 

四、绝对是坑

  为解决第3节第2点注意事项中提及的问题。我们可以通过下列两种方式处理

Runtime r = Runtime.getRuntime();
try{Process proc = r.exec("cmd /c dir"); // 假设该操作为造成大量内容输出// 采用字符流读取缓冲池内容,腾出空间BufferedReader reader = new BufferedReader(new InputStreamReader(proc.getInputStream(), "gbk")));String line = null;while ((line = reader.readLine()) != null){System.out.println(line);}// 或采用字节流读取缓冲池内容,腾出空间// ByteArrayOutputStream pool = new ByteArrayOutputStream();// byte[] buffer = new byte[1024];// int count = -1;// while ((count = proc.getInputStream().read(buffer)) != -1){//   pool.write(buffer, 0, count);//   buffer = new byte[1024];// }// System.out.println(pool.toString("gbk"));int exitVal = proc.waitFor();System.out.println(exitVal == 0 ? "成功" : "失败");
}
catch(Exception e){e.printStackTrace();
}


这里要注意一个坑:外部程序在执行结束后将会自动关闭,否则不管是字符流还是字节流均由于既读不到数据,又读不到流结束符而出现阻塞Java进程运行的情况。

而 cmd /c 就是告诉cmd环境进程,当执行完成后关闭自身。

 

五、参考

  http://fuliang.iteye.com/blog/574260

转自:http://www.cnblogs.com/fsjohnhuang/p/4081445.html 

http://www.lbrq.cn/news/843355.html

相关文章:

  • 菜单宣传网站怎么做/网络广告推广方法
  • wordpress网站如何添加栏目/模拟搜索点击软件
  • 南阳专业做网站公司/百度搜索指数排行
  • 做一个微网站平台/百度推广业务员
  • 有服务器了怎么做网站/apple私人免费网站怎么下载
  • 帝国cms建站实例教程/百度快照客服
  • 分类信息网站做淘客/seo资源网站排名
  • 营销型网站建设制作推广/市场调研方案
  • 在线做漫画网站/上海网络营销有限公司
  • 白帽网站/seo搜索引擎优化推广
  • 成都网站建设公司好做吗/搜索引擎营销的原理
  • 新郑整站优化/免费自己建网站
  • 我做的网站怎么是危险网站/网站seo关键词排名推广
  • 上海网站关键词排名优化报价/长沙百度快速排名
  • 网站建设企业站模板/个人网上卖货的平台
  • 个人博客网站制作教程/seo关键词排优化软件
  • 营销网站/百度seo关键词怎么做
  • 网站商业授权/软文广告经典案例
  • 开发网站需要多少人/百度软文推广怎么做
  • 响应式网站怎么做/俄罗斯搜索引擎入口
  • 没有基础学做网站/sem和seo是什么职业岗位
  • 北京做百度网站建设/中视频自媒体平台注册
  • 动态网站系统的5个组成部分/深圳整站seo
  • 湖南网红网站建设有限公司/最经典的营销案例
  • asp网站免费完整源码/药品销售推广方案
  • wordpress+vps建站/刷赞业务推广网站
  • 深圳网站建设十强/app拉新平台
  • vue.js 可以做网站吗/什么都不懂能去干运营吗
  • 网站开发进阶/专业网页设计和网站制作公司
  • 政府机构网站开发价格/互联网推广有哪些方式
  • 春秋云镜 initial
  • 【橘子分布式】Thrift RPC(编程篇)
  • HashMap详解
  • LVS集群技术
  • 【LeetCode 热题 100】94. 二叉树的中序遍历——DFS
  • Why C# and .NET are still relevant in 2025