我在d:\hello下有一个dos程序hello.exe,并把该路径加入path
调用Runtime.getRuntime().exec("hello.exe");为什么看不到我的程序执行,但是在task manager中看到有cmd.exe 在运行,因为我执行了多次,所以看到有好几个,而且我试着exec("sqlplus")也不行,但是sqlplus进程也启动了,就是没有弹出窗口让我登陆,但是exec("notepad")就可以,好像是执行图形类的程序就可以,很奇怪的一个问题啊,各位高手帮忙啊,因为我要在java下调用别人做的c程序,不是很方便用jni来实现。
调用Runtime.getRuntime().exec("hello.exe");为什么看不到我的程序执行,但是在task manager中看到有cmd.exe 在运行,因为我执行了多次,所以看到有好几个,而且我试着exec("sqlplus")也不行,但是sqlplus进程也启动了,就是没有弹出窗口让我登陆,但是exec("notepad")就可以,好像是执行图形类的程序就可以,很奇怪的一个问题啊,各位高手帮忙啊,因为我要在java下调用别人做的c程序,不是很方便用jni来实现。
这些我们是看不到的
需要我们用OutputSream来捕获输出Process p=Runtime.getRuntime().exec("hello.exe");
p.getOutputStream()
我exec("QQ.EXE"); 执行了以后 可以看到QQ 但是怎么在JAVA程序里面输入ID PASSWORD
而不用再手工输入
借宝地问一下相关问题
我exec("QQ.EXE"); 执行了以后 可以看到QQ 但是怎么在JAVA程序里面输入ID PASSWORD
而不用再手工输入
晕死,获得焦点,哈哈,不要用java做这种事,你会郁闷死的
除非QQ.exe提供参数
一直都这么用,注意路径中不能有空格存在,否则启动不了
注意:
这时另外一个进程的System.in和System.out不是键盘和显示器,而是和java主进程进行通信的那个标注输入输出流 ,原理和两个线程间的管道流一样的
try
{
process = Runtime.getRuntime().exec (command);
InputStreamReader ir=newInputStreamReader(process.getInputStream());
LineNumberReader input = new LineNumberReader (ir);
String line;
while ((line = input.readLine ()) != null)
System.out.println(line);
}
catch (java.io.IOException e){
System.err.println ("IOException " + e.getMessage());
}
/////////////////////////////////////////////////////////////////////////////////////
Runtime.exec(“文本“)文本的内容必须在DOS或平台上可执行,如Runtime.exec(”move c:\\a.txt c:\\b\\”)就肯定执行不了,所以只能用拆衷的办法,把move c:\a.txt c:\b\写在一个批处理文件T内,然后执行:Runtime.exec(”t.bat:”)
该方法有6个可访问版本:
1.exec(String command)
2.exec(String command, String envp[], File dir)
3.exec(String cmd, String envp[])
4.exec(String cmdarray[])
5.exec(String cmdarray[], String envp[])
6.exec(String cmdarray[], String envp[], File dir)一般的应用程序可以直接使用第一版本,当有环境变量传递的时候使用后面的版本.
其中2和6版本可以传递一个目录,标识当前目录,因为有些程序是使用相对目录的,所以就要使用这个版本.
当要执行批处理的时候,不能直接传递批处理的文件名,而要使用:
cmd.exe /C start 批处理文件名
使用dos命令(比如dir)时也要使用掉调用.如果想与调用的程序进行交互,那么就要使用该方法的返回对象Process了,通过Process的getInputStream(),getOutputStream(),getErrorStream()方法可以得到输入输出流,然后通过InputStream可以得到程序对控制台的输出信息,通过OutputStream可以给程序输入指令,这样就达到了程序的交换功能.
例子如下:
package com.broadcontact.netadmin.schedule;
import java.io.PrintWriter;
import java.io.PrintStream;
import java.io.IOException;
import java.sql.SQLException;
import java.util.Date;
import java.io.StringReader;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.Reader;
import java.io.File;
import java.io.BufferedWriter;
import java.io.OutputStreamWriter;
/**
* <p>Title: netadmin</p>
* <p>Description: </p>
* <p>Copyright: Copyright (c) 2002</p>
* <p>Company: nm group</p>
* @author Maico(Panghf)
* @version 1.0
*/
public class ExecuteTask implements Runnable {
private boolean isRunning=true;
public ExecuteTask() {
}
public void run(){
}
public static void main(String[] args){
try {
Process proc=Runtime.getRuntime().exec("cmd.exe");
BufferedReader read=new BufferedReader(new InputStreamReader(proc.getInputStream()));
new Thread(new Echo(read)).start();
PrintWriter out=new PrintWriter(new OutputStreamWriter(proc.getOutputStream()));
BufferedReader in=new BufferedReader(new InputStreamReader(System.in));
String instr = in.readLine();
while(!"exit".equals(instr)){
instr = in.readLine();
out.println(instr);
file://out.println("telnet 192.168.0.1");
out.flush();
}
in.readLine();
read.close();
out.close();
}
catch (IOException ex) {
ex.printStackTrace();
}
}
}
class Echo implements Runnable {
private BufferedReader read;
public Echo(BufferedReader read){
this.read = read;
}
public void run() {
try {
String l = read.readLine();
while (l != null) {
System.out.println(l);
l = read.readLine();
}
System.out.println("---执行完毕:");
}
catch (IOException ex) {
ex.printStackTrace();
}
}
}