javajava 调用cmdd,一个操作需要多次输入

java调用需要输入的外部可执行程序 - CSDN博客
java调用需要输入的外部可执行程序
使用Runtime.getRuntime().exec()方法可以在java程序里运行外部程序。
& 1. exec(String command)
& 2. exec(String command, String envp[], Filedir)
& 3. exec(String cmd, String envp[])
& 4. exec(String cmdarray[])
& 5. exec(String cmdarray[], String envp[])
& 6. exec(String cmdarray[], String envp[], Filedir)
一般的应用程序可以直接使用第一版本,当有环境变量传递的时候使用后面的版本。其中2和6版本可以传递一个目录,标识当前目录,因为有些程序是使用相对目录的,所以就要使用这个版本。
cmd.exe /c start
使用DOS命令(比如dir)时也要使用到调用。如果想与调用的程序进行交互,那么就要使用该方法的返回对象Process了,通过Process的getInputStream(),getOutputStream()和getErrorStream()方法可以得到输入输出流,然后通过InputStream可以得到程序对控制台的输出信息,通过OutputStream可以给程序输入指令,这样就达到了程序的交换功能。
用Java编写应用时,有时需要在程序中调用另一个现成的可执行程序或系统命令,这时可以通过组合使用Java提供的Runtime类和Process类的方法实现。下面是一种比较典型的程序模式:
2&&Process&process&=&Runtime.getRuntime().exec(&.\\p.exe&);
3&&process.waitfor();
在上面的程序中,第一行的“.\\p.exe”是要执行的程序名,Runtime.getRuntime()返回当前应用程序的Runtime对象,该对象的exec()方法指示Java虚拟机创建一个子进程执行指定的可执行程序,并返回与该子进程对应的Process对象实例。通过Process可以控制该子进程的执行或获取该子进程的信息。第二条语句的目的等待子进程完成再往下执行。
但在windows平台上,如果处理不当,有时并不能得到预期的结果。下面是笔者在实际编程中总结的几种需要注意的情况:
& 1、执行DOS的内部命令
&如果要执行一条DOS内部命令,有两种方法。一种方法是把命令解释器包含在exec()的参数中。例如,执行dir命令,在NT上,可写成exec(&cmd.exe&&/c dir&),在windows95/98下,可写成“command.exe /cdir”,其中参数“/c”表示命令执行后关闭DOS立即关闭窗口。另一种方法是,把内部命令放在一个批命令my_dir.bat文件中,在Java程序中写成exec(&my_dir.bat&)。如果仅仅写成exec(&dir&),Java虚拟机则会报运行时错误。前一种方法要保证程序的可移植性,需要在程序中读取运行的操作系统平台,以调用不同的命令解释器。后一种方法则不需要做更多的处理。
& 2、打开一个不可执行的文件
&打开一个不可执行的文件,但该文件存在关联的应用程序,则可以有两种方式。以打开一个word文档a.doc文件为例,Java中可以有以下两种写法:
1&&exec(&start&.\\a.doc&);
2&&exec(&Files\\Microsoft&Office\\office\\winword.exe&.\\a.doc&);
&显然,前一种方法更为简捷方便。
& 3、执行一个有标准输出的DOS可执行程序
&在Windows平台上,运行被调用程序的DOS窗口在程序执行完毕后往往并不会自动关闭,从而导致Java应用程序阻塞在waitfor()语句。导致该现象的一个可能的原因是,该可执行程序的标准输出比较多,而运行窗口的标准输出缓冲区不够大。解决的办法是,利用Java中Process类提供的方法让Java虚拟机截获被调用程序的DOS运行窗口的标准输出,在waitfor()命令之前读出窗口的标准输出缓冲区中的内容。一段典型的程序如下:
2&&String&s;
3&&Process&process&=&Runtime.getRuntime().exec(&cmd&/c&dir&\\windows&);
4&&BufferedReader&bufferedReader&=&new&BufferedReader(new&InputStreamReader(process.getInputStream());
5&&while((s=bufferedReader.readLine())&!=&null)
6&&System.out.println(s);
7&&process.waitfor();
=================================================================================================================================
关键字 Java 外部程序 CMD 进程 调用 Process
最近接触一个需求,是利用Java调用本地命令行程序,并希望Java程序能与该命令行程序进行交互,Java对该程序的操作如同在终端中对程序的操纵一样。
在技术调研的过程中,遇到了几个问题:
如何Java调用命令行程序如何利用Java向命令行程序的标准输入写入字符流如何利用Java即时地得到命令行程序的标准输出流。如何利用Java即时地得到命令行程序的标准错误流
一、调用命令行程序
这个很简单,Java调用的方法为
&& Process process =Runtime.getRuntime().exec(“command name”);
Process的JavaDoc地址:
二、标准输出
注意,在这里标准输出指的是Java程序以标准输出的方式发出字节流,这些字节流会以标准输入的方式进入被调用的命令行程序
OutputStream pOutputStream = process.getOutputStream();
PrintWriter outputWriter = new PrintWriter(pOutputStream,true);
outputWriter.print(string);
PrintWriter的第二个构造参数一定要选为true,这样才能自动flush进入外部程序,不然,没有Flush,你向被调用程序所写的输入,只有在下一次缓冲被Flush的时候才能发挥作用,这样,当你的输入很少时,你虽然在代码里print了命令,但是外部程序并没有得到他,就一直阻塞,这是开发者经常会遇到的问题。
此处我用如上代码并不能解决问题,我的代码如下,成功运行:
Process p = run.exec(cmd);// 启动另一个进程来执行命令&
OutputStream out =p.getOutputStream();
&out.write(byBuffer);
&out.flush();
三、标准输入和错误输入
private InputStream pErrorStream = process.getErrorStream();
private InputStream pInputStream =process.getInputStream();
这两个输入是用来接受外部程序的反馈的,外部程序通常会向标准终端打印字符,这些字符会通过这两个流得到,经过测试,我们发现一个问题,如果外部程序在输出信息时,没有用flush也会出现问题,比如C语言的程序
scanf(“%d”, &i);
printf(“%d”, i);
这段代码在运行时,虽然在终端里会即时的显示出来,但是却不能及时地发送给pInputStream,这是因为程序输出使用了缓冲机制造成的,所以,这造成的困难是如果你没有外部程序的源码,你就很难将输出即时显示出来,我目前还没有找到解决方案,如果你有源码就好办了,在源码中设置输出为即时flush就好了,我用笨办法来说明:
scanf(“%d”, &i);
printf(“%d”, i);
fflush(stdout);
这样,fflush(stdout)之后,pInputStream就会得到输入了。
下面我们用三个线程来进行一个简单的与外部程序的交互过程的设计
process.waitFor(),负责建立线程并等待线程结束
for (int i = 0; i & -1; i =pInputStream.read(inBuffer)) {
&&&&&&&&&&&&&&&&&&&// We have a new segment of input, so process it as aString..
&&&&&&&&&&&&&&&&&&&System.out.print(new String(inBuffer, 0, i));
负责接收外部程序的输出信息
&&&&&&&&&&&&&&&// Read the ErrorStream in a loop until we find no more bytes toread..
&&&&&&&&&&&&&&&for (int i = 0; i & -1; i =pErrorStream.read(errBuffer)) {
&&&&&&&&&&&&&&&&&&&// We have a new segment of error, so process it as aString..
&&&&&&&&&&&&&&&&&&&Systerm.err.print(new String(errBuffer, 0, i));
&&&&&&&&&&&&&&&}
负责接收外部程序的错误输出信息
在适当的地方,调用outputWriter.print(string);向程序写入字符流。
===========================================================================================================
1java调用外部程序的方法&&
在一个java应用中,可能会遇到这样的需求,就是需要调用一些外部的应用做一些处理,比如调用excel,然后在继续程序的运行。&&
下面就开始进入java调用外部程序的一些演示,让java应用更加灵活。&&
1:最简单的演示:&&
Runtime.getRuntime().exec(&notepad.exe&);&&
记事本被打开了是吧。&&
2:传递应用程序的参数:&&
Runtimeruntime=Runtime.getRuntime();&&
String[]commandArgs={&notepad.exe&,&c:/boot.ini&};&&
runtime.exec(commandArgs);&&
现在不单单打开了记事本,而且还装载了boot.ini文件是吧。&&
现在已经完全解决了调用外部程序的问题,不是吗,但是大家会发现exec方法是有返回值,那么继续我们的演示吧。&&
1:Process的waitFor:&&
Runtimeruntime=Runtime.getRuntime();&&
String[]commandArgs={&notepad.exe&,&c:/boot.ini&};&&
Processprocess=runtime.exec(commandArgs);&&
intexitcode=process.waitFor();&&
System.out.println(&finish:&+exitcode);&&
执行上面的代码以后发现不同的地方了吗,waitFor会使线程阻塞,只有外部程序退出后才会执行System.out.println(&finish:&+exitcode);&&
这个功能很有用是吧,因为多数时候你都需要等待用户处理完外部程序以后才继续你的java应用。&&
2:Process的destroy:&&
Runtimeruntime=Runtime.getRuntime();&&
String[]commandArgs={&notepad.exe&,&c:/boot.ini&};&&
final Processprocess=runtime.exec(commandArgs);&&
new Thread(newRunnable(){&&
@Override&&
public void run() {&&
Thread.sleep(5000);&&
} catch (InterruptedException e){}&&
process.destroy();&&
}}).start();&&
intexitcode=process.waitFor();&&
System.out.println(&finish:&+exitcode);&&
这个演示稍微复杂了一些,如果你等待5秒,就会发现记事本自动关闭了,是的,这个就是destroy方法的作用,强制关闭调用的外部程序。&&
不用我解释了吧,这是非常有用的方法。&&
以上的部分已经足够你调用并控制你的外部应用了。如果需要更详细的信息,看javadoc文档吧。&&
最后的说明:ProcessBuilder这个1.5新增的类也可以完成同样的任务,Runtime就是调用了这个类。
============================================================================================================
Java调用外部程序命令主要用到两个类:&
java.lang.Runtime&
每个 Java 应用程序都有一个 Runtime 类实例,使应用程序能够与其运行的环境相连接。可以通过 getRuntime方法获取当前运行时。应用程序不能创建自己的 Runtime 类实例。&
java.lang.Process&
ProcessBuilder.start() 和 Runtime.exec 方法创建一个本机进程,并返回 Process子类的一个实例,该实例可用来控制进程并获取相关信息。Process类提供了执行从进程输入、执行输出到进程、等待进程完成、检查进程的退出状态以及销毁(杀掉)进程的方法。 对于带有 Process 对象的Java 进程,没有必要异步或并发执行由 Process 对象表示的进程。&
下面Java调用Windows命令的例子:
下面Java调用Perl命令的例子:
=================================================================================================
几乎所有的Java集成开发环境都需要调用外部进程进行Java程序的构建,编译,运行和调试,Eclipse,NetBeans,JBuilder和IntellijIDLE概莫例外。在执行过程中,将提示信息以黑色全部打印在控制台里,将异常和错误以红色方式打印。以非常醒目交互体验让程序员远离枯燥和乏味。
现在让我们以Eclipse为例来看看它如何工作的,以揭开它神秘面纱,探究隐藏在后面的秘密。
主要介绍了JAVAIDE Console通过采用Runtime.getRuntime.exec()执行外部程序后,将返回一个Process对象.Process对象能返回三个流:
getInputStream(),对应Process程序的标准输出流。
getErrorStream(), 对应Process程序的标准错误输出流。
getOutputStream();对应Process程序的标准输入流。
函数名之所以与Process程序的方向相反,原因是站在Java Host程序的角度讲的。
现在我们应用此原理来仿真IDE 执行外部程序的过程。
列表1:ConsoleSimulator.java
import&&java.io.BufferedR
import&&java.io.IOE
import&&java.io.InputS
import&&java.io.InputStreamR
import&&java.io.OutputS
public&&&class&&ConsoleSimulator&&implements&&Runnable&{
&&&&&private&&&volatile&&&boolean&&isStop&&=&&&false&;
&&&&&private&&&static&&&final&&&int&&INFO&&=&&&<span style="color:#&;
&&&&&private&&&static&&&final&&&int&&ERROR&&=&&&<span style="color:#&;
&&&&&private&&InputStream&
&&&&&private&&&int&&
&&&&&public&&ConsoleSimulator(InputStream&is,&&int&&type)&{
&&&&&&&&&this&.is&&=&&
&&&&&&&&&this&.type&&=&&
&&&&&public&&&void&&run()&{
&&&&&&&&InputStreamReader&isr&&=&&&new&&InputStreamReader(is);
&&&&&&&&BufferedReader&reader&&=&&&new&&BufferedReader(isr);
&&&&&&&&String&s;
&&&&&&&&&try&&{
&&&&&&&&&&&&&while&&((&!&isStop)&&&&&&(s&&=&&reader.readLine())&&!=&&&null&)&{
&&&&&&&&&&&&&&&&&if&&(s.length()&&!=&&&<span style="color:#&)&{
&&&&&&&&&&&&&&&&&&&&&if&&(type&&==&&INFO)&{
&&&&&&&&&&&&&&&&&&&&&&&&System.out.println(&&&INFO&&&&&&&#43;&&s);
&&&&&&&&&&&&&&&&&&&&}&&else&&{
&&&&&&&&&&&&&&&&&&&&&&&&System.err.println(&&&ERROR&&&&&&&#43;&&s);
&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&&try&&{
&&&&&&&&&&&&&&&&&&&&&&&&Thread.sleep(&<span style="color:#&);
&&&&&&&&&&&&&&&&&&&&}&&catch&&(InterruptedException&ex)&{
&&&&&&&&&&&&&&&&&&&&&&&&ex.printStackTrace();
&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&}
&&&&&&&&}&&catch&&(IOException&ex)&{
&&&&&&&&&&&&ex.printStackTrace();
&&&&&public&&&void&&stop()&{
&&&&&&&&isStop&&=&&&true&;
&&&&&public&&&static&&&void&&main(String[]&args)&&throws&&IOException,
&&&&&&&&&&&&InterruptedException&{
&&&&&&&&&//&Process&child&=&Runtime.getRuntime().exec(&run.bat&);&
&&&&&&&&Process&child&=&Runtime.getRuntime().exec(&&&java&-classpath&bin&helloworld.Test&&&);
&&&&&&&&OutputStream&os&&=&&child.getOutputStream();
&&&&&&&&InputStream&stdin&&=&&child.getInputStream();&//
&&&&&&&&InputStream&stderr&&=&&child.getErrorStream();
&&&&&&&&Thread&tIn&&=&&&new&&Thread(&new&&ConsoleSimulator(stdin,&INFO));
&&&&&&&&Thread&tErr&&=&&&new&&Thread(&new&&ConsoleSimulator(stderr,&ERROR));
&&&&&&&&tIn.start();
&&&&&&&&tErr.start();
&&&&&&&&&int&&result&&=&&child.waitFor();
&&&&&&&&tIn.join();
&&&&&&&&tErr.join();
&&&&&&&&&if&&(result&&==&&&<span style="color:#&)&{
&&&&&&&&&&&&System.out.println(&&&SUCCESS!&&&);
&&&&&&&&}&&else&&{
&&&&&&&&&&&&System.out.println(&&&FAILED!&&&);
外部Bat文件:
cmd.exe&&/&C&&/&Q&copy&
cmd.exe&&/&C&tree
rem&c:\Designer_v5.&<span style="color:#&.0_win32_x86.exe&c:\Designer_v5.&<span style="color:#&.0_win32_x861.exe
测试Java类Test.java
import&java.io.BufferedR
import&java.io.FileR
import&java.io.IOE
public&class&Test&{
&&&&public&static&void&main(String[]&args)&throws&IOException&{
&&&&&&&&FileReader&fir&=&new&FileReader(&src/helloworld/Test1.java&);
&&&&&&&&BufferedReader&br&=&new&BufferedReader(fir);
&&&&&&&&String&s;
&&&&&&&&while((s=br.readLine())!=null){
&&&&&&&&&&&&System.out.println(s);
&&&&&&&&fir.close();
综上,虽然没有在自己的GUI里将stdout和stderr进行说明,只是用ERROR&提示符和INFO&提示符进行演示,但是完全IDEConsole的原理。对ConsoleSimulator稍加修改,完全放入到自己的应用程序当中去。
在我们进行Java程序开发的过程当中,可能涉及到其它的应用程序,借助这种技术,可以很好利用它们,将它们集成到自己的应用当中,将极大地缩短开发周期,何乐而不为呢!
from:(有删改)
本文已收录于以下专栏:
相关文章推荐
在C++中,通过创建子进程的方法,可以在程序中像调用函数一样调用外部可执行程序。
方法如下:使用fork()函数创建子进程;
主进程暂停,通过execlp()在子进程中调用外部可执行文件;
等待子进程...
刚刚又装了一次软件,打开cmd输入python出现以下这种情况。
我的解决办法:
先将Python的安装路径复制,我的电脑-&属性-&高级系统设置-&高级-&环境变量-&系统变量,在PATH...
最近的任务用到C#来调用C++内核程序,也就是C++编译运行后生成的.exe文件。网搜了一下C#中运行外部程序大致有两种方法,在此稍作总结:
(1)使用API函数ShellExcute
&#160;&#160;&#160;&#160;&#160;&#160;&#160;...
1. java程序编写的应用程序是.jar文件包。运行.jar文件需要安装Java虚拟机。
如果你的机子上安装了jre(JAVA运行虚拟机),那就直接用用编程工具,比如netbeans,eclips等...
创建可执行的 jar 文件包--制作一个可执行的 jar 文件包来发布你的程序是 jar 文件包最典型的用法
java 程序是由若干个 .class 文件组成的。这些 .class 文件必须根据它们...
初始工作:新建文件夹,把jdk拷贝进去(用户机不一定安装java环境,所以我们要把jdk一块打包)
一、选择项目右键导出
二、选择java - JAR file - next
三、选择导出路径...
他的最新文章
讲师:王禹华
讲师:宋宝华
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)java代码操作cmd二次运行新java程序
java代码操作cmd二次运行新java程序:很多java程序员在初学java的时候都使用过cmd编译运行java程序。
我这篇博客的目的就是在java代码中调用cmd方法去编译运行新的java程序。
其实java中已经给我们提供了操作cmd的方法了,如下:
String cmd=
Runtime.getRuntime().exec(cmd);
这个方法有很多用途,可以打开程序,如记事本等等。
首先使用 cmd /?方式查看java给我们提供的帮助信息
Runtime.getRuntime().exec(&cmd /?&);
编译运行后查看输出结果(这里只显示部分结果):
启动 Windows 命令解释器的一个新实例
CMD [/A | /U] [/Q] [/D] [/E:ON | /E:OFF] [/F:ON | /F:OFF] [/V:ON | /V:OFF]
[[/S] [/C | /K] string]
执行字符串指定的命令然后终止
执行字符串指定的命令但保留
修改 /C 或 /K 之后的字符串处理(见下)
禁止从注册表执行 AutoRun 命令(见下)
使向管道或文件的内部命令输出成为 ANSI
使向管道或文件的内部命令输出成为
设置前台/背景颜色(详细信息见 COLOR /?)
启用命令扩展(见下)
禁用命令扩展(见下)
启用文件和目录名完成字符(见下)
禁用文件和目录名完成字符(见下)
使用 ! 作为分隔符启用延迟的环境变量
扩展。例如,/V:ON 会允许 !var! 在执行时
扩展变量 var。var 语法会在输入时
扩展变量,这与在一个 FOR
循环内不同。
禁用延迟的环境扩展。
这里最关键的是这两句话:
/C 执行字符串指定的命令然后终止
/K 执行字符串指定的命令但保留
接下来我开始演示使用java代码操作cmd运行新的java程序
首先,编写一个新的java程序(我的类名 Text),路径自己选
import java.util.D
import java.util.T
import java.util.TimerT
public class Text
private int i=0;
public Text(){
Timer timer =new Timer();
TimerTask task = new TimerTask() {
public void run() {
System.out.println(i);
timer.schedule(task, new Date(), 1000);
public static void main(String[] args)
new Text();
接下来使用cmd去编译程序,这里需要你把程序完整位置写出来
1.main(操作cmd,使用Process方式获取操作结果)
public CmdText() {
String cmd=&cmd /c javac f:/AText/Text.java&;
Process p = Runtime.getRuntime().exec(cmd);
getSuccess(p);
getDefault(p);
} catch (Exception e) {
e.printStackTrace();
2.处理操作结果,使用process后系统会已流的方式返回结果,而我们需要做的就是处理这些流。这里我有些复用代码了XXX
// 处理运行正常
private void getSuccess(Process p) throws IOException {
sbr = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line =
while ((line = sbr.readLine()) != null) {
System.out.println(line);
// 处理运行失败
private void getDefault(Process p) throws IOException {
dbr = new BufferedReader(new InputStreamReader(p.getErrorStream()));
String line =
while ((line = dbr.readLine()) != null) {
System.out.println(line);
3.查看编译结果结果
因为是编译,所以编译成功后不好输出结果。
4.开始运行
运行时候就是把上面main里的
String cmd改变一下。如下:
String cmd = &cmd /c java Text&;
Process p = Runtime.getRuntime().exec(cmd);
getSuccess(p);
getDefault(p);
} catch (Exception e) {
e.printStackTrace();
接下来就是结果:
这里可以看到,Text程序在运行。线程也在输出结果。
这里就是你需要去更改你的环境变量,环境变量里只需要添加你新建的java程序父文件夹的位置即可,不然程序会报以下这个错误
错误: 找不到或无法加载主类查看: 3427|回复: 7
java调用cmd命令,如何模拟输入Y键
论坛徽章:2
本帖最后由 zijingshanke 于
17:17 编辑
keytool -import -alias publiccert -file D:\cert.cer -keystore D:\publicCerts.store -storepass&&publicstore123
下载cert.cer
用java程序调用上面的命令
public static String exec(String cmd) {
&&StringBuffer sb1;
&&StringBuffer sb2;
&&sb1 = new StringBuffer();
&&sb2 = new StringBuffer();
&&String temp1 = &&;
&&String temp2 = &&;
&&Runtime rt = Runtime.getRuntime();
& &System.out.println(cmd);
& &Process p = rt.exec(cmd);
& &BufferedReader bufferedReader1 = new BufferedReader(
& &&&new InputStreamReader(p.getInputStream(),&GBK&));
& &BufferedReader bufferedReader2 = new BufferedReader(
& &&&new InputStreamReader(p.getErrorStream()));
& &while ((temp1 = bufferedReader1.readLine()) != null) {
& & sb1.append(temp1);
& & System.out.println(temp1);
& &while ((temp2 = bufferedReader2.readLine()) != null) {
& & sb2.append(temp2);
& & System.out.println(temp2);
& &p.waitFor();
& &return sb1.toString();
&&} catch (Exception e) {
& &e.printStackTrace();
&&return sb1.toString();
程序不能执行完,在cmd窗口输入命令,需要输入“Y”才能走下去
(5.53 KB, 下载次数: 2)
17:07 上传
论坛徽章:3
无所为而无所谓.无所谓而无所不为
顶,是一种风采&&
认证徽章论坛徽章:104
论坛徽章:53
cmd命令后可以捕捉输入输出来继续操作的
论坛徽章:0
如何通过java调用cmd命令
论坛徽章:10
System.in.read读取输入即可,判断得到的是否为需要的内容.
论坛徽章:56
从控制台的输入流读取后判断
论坛徽章:2
最简单解决:命令行前加 echo Y |&&即可
论坛徽章:0
李成功、网盘有PS、FlashFXP、Alcohol 120%、人脸识别软件、RAR密码破解工具、系统工具、驱动、等等、教程有PS、黑客技术、网页三剑客、Word、Excel、PowerPoint 、Access等等、成功视频有、陈安之、李践、李强、刘一秒、杜云生、销售、管理应有尽有、英语、西班牙、日语、英语口语学习软件和教程、方便大家下载不断上传要什么有什么你就不用在找了、免费下载地址 /u/1149889
免费送一句激励的话、失败不可怕放弃最没用、我每次遇到挑战的时候、我看到的是我要的结果而不是障碍、我接受挑战、相信自己一定能做到、绝不绝不绝不放弃、我的梦想和目标、拼到最后一定可以战胜一切障碍。
itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有    
 北京市公安局海淀分局网监中心备案编号:10 广播电视节目制作经营许可证:编号(京)字第1149号

我要回帖

更多关于 java调用cmd命令 的文章

 

随机推荐