HardBirch

关于Java调用外部程序的总结

时间:13-01-17 栏目:JAVA语言-JVM虚拟机 作者:张飞不张,文采横飞 评论:0 点击: 4,326 次

Windows上外部程序的调用问题

(1) 按照Java提供的一般外部程序调用方法,如下:

String cmd = "Mythroad.net.exe arg0 arg1";
System.out.println("开始外部调用开始... "+cmd);
Process process = Runtime.getRuntime().exec(cmd);
System.out.println("开始外部调用执行中...");
process.waitFor();
System.out.println("开始外部调用执行完毕...");

如上所示,很方便,而且可以传入需要的参数。

(2)但是,当我们需要调用bat脚本(windows批处理命令)的时候,可以这样写:

String cmd = "cmd Mythroad.net.bat";
System.out.println("开始外部调用开始... "+cmd);
Process process = Runtime.getRuntime().exec(cmd);
System.out.println("开始外部调用执行中...");
process.waitFor();
System.out.println("开始外部调用执行完毕...");

如上所示,这个时候,bat脚本是以参数的形式传递给command程序的;

(3)但是,当我们的批处理命了也需要参数的时候怎么办呢?

String cmd = "cmd Mythroad.net.bat arg0  arg1";
System.out.println("开始外部调用开始... "+cmd);
Process process = Runtime.getRuntime().exec(cmd);
System.out.println("开始外部调用执行中...");
process.waitFor();
System.out.println("开始外部调用执行完毕...");

上述的实现,OK么?您可以试试,这个时候 arg0 与 arg1 传递给的是command程序, Mythroad.net.bat 是无法接收到参数的;

(4) 所以这个时候,得利用一个小工具 Batch File Compile,去把bat脚本编译成可执行程序,这样的话,就可以无需cmd的辅助,直接调用,并传入参数。工具如下图所示:

工具转换后会生成一个Mythroad.net.exe这样的程序,弱可以按如下方式调用执行:

String cmd = "Mythroad.net.exe arg0  arg1";
System.out.println("开始外部调用开始... "+cmd);
Process process = Runtime.getRuntime().exec(cmd);
System.out.println("开始外部调用执行中...");
process.waitFor();
System.out.println("开始外部调用执行完毕...");

赶紧执行以下试试吧 ^_^!

Linux上外部程序的调用问题

(5)在经过上上述的实验之后往往会考虑到将bat脚本用shell脚本实现,然后使用shell编译成二进制的工具进行转制,好的,工具shc已经准备就绪。ok把mythroad.net.sh 的程序转化后生成 mythroad.net.exe的二进制执行程序,shell下直接传入参数执行成功!

开始外部调用开始...  mythroad.net.exe  arg0 arg1
java.io.IOException: Cannot run program "mythroad.net.exe": java.io.IOException: error=13, Permission denied
at java.lang.ProcessBuilder.start(ProcessBuilder.java:460)
at java.lang.Runtime.exec(Runtime.java:593)
at java.lang.Runtime.exec(Runtime.java:431)
at java.lang.Runtime.exec(Runtime.java:328)
at ...
Caused by: java.io.IOException: java.io.IOException: error=13, Permission denied
at java.lang.UNIXProcess.<init>(UNIXProcess.java:148)
at java.lang.ProcessImpl.start(ProcessImpl.java:65)
at java.lang.ProcessBuilder.start(ProcessBuilder.java:453)
... 8 more

Exception: java.io.IOException: error=13, Permission denied, 转之后会出现问题? 这可怎么解决呢!

分析:vi mythroad.net.exe 看一下,其实shc转出来的还是明文,其实只是做了编码和加密处理,与真正的可执行程序是不一样样的。

解决方法:重新查了下Linux上java调用外部程序的方法,其实无需windows上这么复杂的思维方式,轻松可以搞定,按如下所示。

String cmd = "bash mythroad.net.sh "+arg0+" "+arg1;
System.out.println("开始外部调用开始... "+cmd);
Process process = Runtime.getRuntime().exec(cmd);
System.out.println("开始外部调用执行中...");
process.waitFor();
System.out.println("开始外部调用执行完毕...");

试一下吧,是不是一件可以正常执行了。

 

(6) Linux上Jav调用一般外部程序调用方法,不多说了:

String cmd = "Mythroad.net arg0 arg1";
System.out.println("开始外部调用开始... "+cmd);
Process process = Runtime.getRuntime().exec(cmd);
System.out.println("开始外部调用执行中...");
process.waitFor();
System.out.println("开始外部调用执行完毕...");

大路货,无需累述,谢谢!

 

 

 

声明: 本文由( 张飞不张,文采横飞 )原创编译,转载请保留链接: 关于Java调用外部程序的总结

关于Java调用外部程序的总结:等您坐沙发呢!

发表评论


QQ群互动

Linux系统与内核学习群:194051772

WP建站技术学习交流群:194062106

魔豆之路QR

魔豆的Linux内核之路

魔豆的Linux内核之路

优秀工程师当看优秀书籍

优秀程序员,要看优秀书!

赞助商广告

友荐云推荐