日期:2014-05-20  浏览次数:20750 次

一个java与外部进程交互的问题(100分)!!!!!

  在java程序里调用runting.exec()获得process,然后得到in,out,err三个流,之后从流里读出数据。

问题是这样的:要执行的这个外部process是个类似telnet的进程,执行后会进入一个consle,而不是通常的执行一个命令返回一些信息。也就是说此进程会hold住,等待下一次的输入。但是在实际的调试中,从流中只能返回第一次执行该外部进程的信息,也无法再次把命令从程序中传到外部进程去。

求解!!

------解决方案--------------------
好像可以定义一个输入流传进去的吧


------解决方案--------------------
exec()的参数
------解决方案--------------------
难度太大,关注 中。。。。。
------解决方案--------------------
帮顶。。。关注中。。。
------解决方案--------------------
你能用in流往里读,就能用out流往外写不就完了嘛
------解决方案--------------------
不是任何程序的输出都可以捕获的,为什么不用java自己的类和远程通信,非要借助额外软件。
既然借助了外部程序,怎么还能是平台无关?
------解决方案--------------------
不能用Runtime.exec而应该用ProcessBuilder.start()。

这样会把进程的控制台去除,把三个流归到JAVA程序中来,方便操作。。。
------解决方案--------------------
补充一下:

用这三个流就可以控制进程了。。。
------解决方案--------------------
你的in会的对端需要你送东西过去的。。。他才会返回。。。

问题:只能返回第一次执行该外部进程的信息,也无法再次把命令从程序中传到外部进程去。

看看你的问题是否是因为,
问题1, 你的out中有没有把必要的信息送过去,打个比方:
telnet到一个设备,输入 display,此时,你会输入一个回车确认传送,那么,你的in里面是否有个“回车”(需要确认对端接受的回车的类型\r\n还是\n).

问题2, 你的in是否已经全部读完了,这点很重要,对端很有可能是根据你全部度去完成的信息之后开通下一次的交互,从而达到同步的效果
------解决方案--------------------
你的这种方案不太好,从java程序启动一个外部进程而又要控制它,显然,问题变成外部进程成为Java程序的“internal”,这与外部进程是矛盾的。
------解决方案--------------------
import java.io.*;
import java.util.*;

public class TestExec ...{
public void runbat(int timeFortmat) ...{
String cmd = "cmd /c start D:/ScheduleRun/data/ "+timeFortmat+ ".bat ";

try ...{
Process ps = Runtime.getRuntime().exec(cmd);
System.out.println(ps.getInputStream());
} catch(IOException ioe) ...{
ioe.printStackTrace();
}
}

public static void main(String[] args)...{
TestExec test1 = new TestExec ();
test1.runbat(1340);
}
}