栏目分类
开源技术 | Hibernate | JUnit | Tomcat | JBoss | eclipse | Spring | ANT | Struts
java新手入门 | 基础入门 | 开发工具 | JDK | oop面向对象 | 安全配置
J2EE | mvcwea | 应用服务器 | Rmi/Corba/Jini | J2ee核心 | Servlet/JSP | EJB | JDBC/JDO
J2ME | 核心技术 | 嵌入式 | 无线开发
XML | WebServices | XMLBeans
高级技术 | 多线程 | 设计模式 | ULM/OO | p2p/Jxta | JavaSecurity
核心技术 | SwingAwtApplet | 高级编程 | 网络编程 | Jvm技术 | JavaMedia
其它技术 | 资讯动态
排行榜
·Jasperreport报表开发指南
·Java正则表达式详解(中)
·Java技巧:使用Runtime.exec重定向本地程序调用
·什么是面向对象的设计思想?
·一些错误地解决方法
·Java正则表达式详解(上)
·java语言操作Oracle数据库中的CLOB数据类型
·Java虚拟机类装载:原理、实现与应用
·复制文件夹内容和删除整个文件夹的2个函数
·如何实现用jacob来调用word的宏
·Java操作Word,Excel,Access,IE,OutLook,PDF等
·用java编写的小游戏源代码分析
·利用JAVA操作EXCEL文件
·在CMPP2.0协议SP端的.NET开发
·JSP:javascript实现输入多行动态输入
·Java高级编程之displayTag学习摘要
·Java正则表达式详解(下)
·一种纯Java的数据库—JDataStore
·分享搞定的CLOB字段存取的代码
·图解VisualStudio.Net团队开发

    您现在的位置: Linux宝库 >> Java >> 核心技术 >> 高级编程 >> 文章正文
Java技巧:使用Runtime.exec重定向本地程序调用
Linux宝库 收集整理  作者:Linux宝库  时间:2007-12-31  收藏本站
来自:http://doc.linuxpk.com/44531.html
联系:linuxmine#gmail.com
分类:[高级编程]
  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的限制。

  本文来自:http://doc.linuxpk.com/44531.html

 
     最新更新
·浅谈JAVA中类的构造器
·Linux+Java=Lava(岩浆)?
·重载与覆盖
·深入理解Java延迟绑定
·类和对象的兼容性
·数组和第一类对象
·纯继承与扩展
·继承和finalize()
·构建器的调用顺序
·内部类标识符
·内部类可以覆盖吗?
·从内部类继承
·引用外部类对象
·static内部类
·链接到外部类
·方法和作用域中的内部类
·内部类和上溯造型
·好的JAVA风格
·彻底明白Java的IO系统
·Javadoc利弊分析
·http断点续传简单实现
·Java的测试规范
·从JAR文件中读取文件
·我的面向对象程序观
·JBuilderX初体验
·Java接口的妙用
·Java相关的编译技术
·Java2D功能概述
·Java操作Word,Excel,Access,IE,OutLook,PDF等
·Java程序的加密和反加密