赛迪网 > IT技术 Java > 技术动态
  IT资讯搜索
 
IT产品搜索
[程序开发][网管世界][网络安全][数据库技术]
[操作系统][嘉宾聊天·在线访谈][活动集锦]
[精彩专题][Symantec专区][订阅IT技术周刊]
[开发论坛][网管论坛][安全论坛][数据库论坛]
[操作系统论坛][Sybase专区][IBM dW技术专区]
[病毒求助][病毒与漏洞播报][文档·源码下载]

使用Runtime.exec重定向本地程序调用

发布时间:2007.05.15 05:24     来源:赛迪网技术社区    作者:dxaw

Java具有使用Runtime.exec对本地程序调用进行重定向的能力,但是用重定向或者管道进行命令调用将会出错。解决这一问题的办法是通过命令shell运行命令。在Java中调用本地程序会破坏平台独立性规则,但是经常需要这么做才行。

  

以下是一个简单类的范例,展示了在Unix下运行ls命令的情形:

import java.io.BufferedInputStream;
  import java.io.IOException;
  
  public class ExecLs {
  
   static public void main(String[] args) {
   String cmd = "ls"
  
   try {
   Process ps = Runtime.getRuntime().exec(cmds);
   System.out.print(loadStream(ps.getInputStream()));
   System.err.print(loadStream(ps.getErrorStream()));
   } catch(IOException ioe) {
   ioe.printStackTrace();
   }
   }
  
   // read an input-stream into a String
   static String loadStream(InputStream in) throws IOException {
   int ptr = 0;
   in = new BufferedInputStream(in);
   StringBuffer buffer = new StringBuffer();
   while( (ptr = in.read()) != -1 ) {
   buffer.append((char)ptr);
   }
   return buffer.toString();
  
  
   
  
  
   }
  
  }

  

    

上述代码中重要的部分是exec方法和命令字符串ls。本程序将输出运行目录下的列表细节。

  

那么,如果你想重定向这些细节内容到文件该怎么办?这一命令行的输入应该写成ls > FILE,但是当你将cmd变量改变成这样的话,运行就会出错,如下:

  

/bin/ls: >: No such file or directory

/bin/ls: FILE: No such file or directory

  

出错的原因在于额外的参数被直接传送到了ls命令而不是送到实际的命令行。解决这一问题的办法是将cmd串弄成一个字符串数组,并且将你想运行的程序传送到命令shell。

  

因此,将cmd行改成下面的样子:

  

String[] cmd = { "sh", "-c", "ls > FILE" };

  

你将得到一个名为FILE的文件,里面是目录列表。-c参数是告诉它读取随后的字符串,而最后的参数是你要运行的脚本。

  

在这种情况下,管道也运行良好,所以你可以把命令改成下面的方式:

  

String[] cmd = { "/bin/sh", "-c", "/bin/ls | grep d > FILE" };

  

这种形式将给你一个名为FILE的文件,里面是ls条目中包含d的条目。给出sh和ls的全路径有利于提供你的程序的安全性。

  

虽然使用Runtime.exec不是创建独立于平台的Java的最佳方式,但是有些时候是必要的。使用这种重定向技术有助于走出Runtime.exec的限制。

(T007)


[ 发表评论 ] 字体[  ] [ 打印 ] [ 进入博客 ] [ 进入论坛 ]  [ 推荐给朋友 ]
  相关文章
· JSF:Java中面向Web开发的生旦净末丑! (05-14) · Java企业应用系统框架的比较与选择 (05-14)
· JDOM入门:使用JDOM解析XML实例详解 (05-11) · 谈谈JAVA程序的反编译是如何实现的 (05-11)
· Java中的文件与磁盘操作技术详细解析 (05-11) · Java中面向对象编程语言的学习之路 (05-11)
· Windows和Linux下搭建J2sdk的环境 (05-11) · 如何感受Java 2 EE 5.0的最新规范特性 (05-11)
· 该病毒是一个危害极大的网上银行 (05-09) · Java规则引擎的工作原理及其实际应用 (04-02)
  客户需求反馈表
* 姓  名:
更多资料  了解方案  认识厂商
* 单位名称:
* 联系电话:
* 电子邮件:
  赛迪推荐  
  手机·资费 ·新品·导购·评测·手机资费·宽带
手机搜索  诺基亚 N73 MOTO Z6
  IT产品 ·笔记本·台式机·服务器·打印·投影
IT产品搜索 
  IT技术 ·开发·网管·安全·数据库·操作系统
  信息化 ·热点·专题·访谈·周刊·方案案例
· 北京新规不能霸王硬上弓 网店牌照缓期执行
· 软件外包之变的新台阶: 提高全球交付能力
· ERP案例分析 SaaS带来冲击 IT服务商面临挑战
· 通方期货CRM解决方案 房地产行业CRM解决方案
  IT博客 ·曾剑秋·项立刚·Java学习·网管
  IT技术论坛 ·开发·网管·安全·数据库·系统