疯狂java


您现在的位置: 疯狂软件 >> 新闻资讯 >> 正文

Java调用外部程序常用算法和封装类


 

   

  一个项目不可能只使用一种编程语言来开发,也不可能由一个人开发,所以,Java程序员要学会和使用其他编程语言的程序员合作。那么,让我来发布一个工具类——Java外接程序扩展包,并将相应算法发布。Java外接程是指用Java调用其他编程语言编写的算法核心Console(命令行)程序并进行交互,为了使得外接变得简便,我编写了这个封装类,方便大家的使用。

  首先,我来介绍这个外接程序的算法——我管这种算法叫做“3进程-3流算法”。3进程指的是:1、主/目标标准输入进程;2、目标标准输出监听进程;3、目标标准错误输出监听进程。3流指的是:1、目标输入流;2、目标输出流;3、目标错误输出流。我来分别解释一下,目标输入流指的是Java程序向外接程序的控制台内输入信息的流,也就好比你就是Java程序,你启动cmd,向里边输入“ping”命令,这就是Java程序与目标程序建立的第一个流。目标输出流指的是目标程序向Java程序输出(或叫做打印)信息,也就好比cmd是目标程序,你是Java程序,你输入“ping”命令之后,cmd给你了回应,因为你没有使用参数,所以ping认为你不知道如何使用它,然后向你做出了标准输出,告诉你如何使用它。然后,目标错误输出流指的是目标程序向Java程序输出了错误信息,就好比你是Java程序,你向cmd程序输入了“abcdefg”,然后cmd认为你输入了错误的指令,所以启动错误流,向你报告你输入错误的信息了。而后两个进程就是为了随时监听标准输出和标准错误输出流的。

  下面,让我们来看看如何实现这些功能,首先,先来看看如何实现执行启动外接程序的字符串:

  复制代码

  public class a{

  public static main(String args[]){

  Runtime runtiem=Runtime.getRuntime();

  Process process;

  process=runtime.exec(command);

  }

  }

  复制代码

  非常简单对吗,在网上的,这句exec只要你一搜索,就会看到被疯传的这句代码。然后,我们来看看如何检测错误信息:

  复制代码

  public class ErrorStream extends Thread{

  /**

  * 从主类中得来的process对象,用于获取流

  */

  public Process process;

  /**

  * 同步文本,随时与目标程序标准错误控制台同步

  */

  public String err="";

  @Override

  /**

  * 线程启动

  *

  */

  public void run() {

  BufferedReader br=new BufferedReader(new InputStreamReader(process.getErrorStream()));

  try {

  printer(br);

  } catch (IOException e) {

  e.printStackTrace();

  }

  }

  /**

  * 更新标准错误信息

  *

  * @param br 使用BufferedReader类型提供的标准错误流

  * @throws IOException 当读取产生错误时

  */

  public void printer(BufferedReader br) throws IOException{

  String temp;

  while((temp=br.readLine())!=null){

  err=err+temp;

  }

  }

  /**

  * 继承Thread类的构造方法,用于创建线程

  *

  */

  public ErrorStream() {

  super();

  // TODO 自动生成的构造函数存根

  }

  /**

  * 继承Thread类的构造方法,用于创建线程并给与名称

  *

  */

  public ErrorStream(String name) {

  super(name);

  // TODO 自动生成的构造函数存根

  }

  }

  复制代码

  这段代码,是我封装的3个类里边的其中一个:ErrorStream,用来检测错误信息。其他的代码我就不在此列举,我的封装源码也提供给了大家,大家下载查看就行了!

  还有一点:我的封装中所有字段、方法和类全部设置成public,但是有很多你不知道或无法理解的类请不要进行操作,以便防止错误。然后我再说一下,本封装中的唯一一个static方法——ExternalProgramUtil.pexe这个方法是封装了直接使用Runtime进行操作的exec指令,只不过为了让大家省点代码,所以不进行初始化操作,任何字段都不会初始化,使用时请注意!