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指令,只不过为了让大家省点代码,所以不进行初始化操作,任何字段都不会初始化,使用时请注意!

下面,到了我们的重头戏——ExternalProgramUtil!我将提供360和百度两种网盘的下载服务:

360:http://yunpan.cn/Qp8T6QxPWTJSe

百度:http://pan.baidu.com/s/1ntlsSit

如果失效或者使用时有问题就来找我吧,邮箱:zhangyutong@zhangyutong.net ,QQ:2276768747 。

另外说一下:由于获取网盘链接和日志无法同步,所以jar包中的本地日志文件无法填写下载链接,敬请原谅!

欢迎大家下载使用!感谢大家对BKMMSC-金鸡独立的支持!

posted @ 2014-02-11 11:06  金鸡独立  阅读(1790)  评论(2编辑  收藏  举报