一个项目不可能只使用一种编程语言来开发,也不可能由一个人开发,所以,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指令,只不过为了让大家省点代码,所以不进行初始化操作,任何字段都不会初始化,使用时请注意!