您的位置:首页 > 编程语言 > Java开发

Java.java程序与其他进程的通信

2011-01-03 00:15 399 查看
Java程序与其他进程的数据通信
在Java程序中可以启动其他应用程序,这种在Java程序中启动的进程叫做子进程。启动子进程的Java程序叫做父进程。父进程就是Java虚拟机。
在Java程序中可以用Process类的实例对象来表示子进程,子进程的标准输入和输出不在连接到键盘和显示器,而是以管道流的形式连接到父进程的一个输出流和输入流对象上。
调用Process类的getOutputStream和getInputStream方法可以获得连接到子进程的输出流和输入流对象。

代码示例:在TestInOut类中启动Java.exe命令执行另外一个MyTest类,TestInOut和MyTest通过进程间的管道相互传递数据。

记住调用Process类的destroy方法结束子进程的运行。

//TestInOut.java
import java.io.*;
public class TestInOut implements Runnable {

Process p=null;
public TestInOut(){
try{
p=Runtime.getRuntime().exec("java MyTest");
new Thread(this).start();
}catch(Exception e){
e.printStackTrace();
}
}

public static void main(String[] args) {
// TODO: Add your code here
TestInOut tio=new TestInOut();
tio.send();
}
//向子进程发送数据
public void send(){
try{
OutputStream ops=p.getOutputStream();
while(true){
ops.write("help/r/n".getBytes()); //向管道中写入数据,当管道的缓冲区被写满而无输出时,程序会处于阻塞状态
}
}catch(Exception e){
e.printStackTrace();
}
}

//接受子进程数据
public void run(){
try{
int count=0;
InputStream in=p.getInputStream();
BufferedReader bfr=new BufferedReader(new InputStreamReader(in));

while(true){
String strLine=	bfr.readLine(); //readLine读不到数据会阻塞
/*if(strLine==null)
return;*/
System.out.println(strLine);
}
}catch(Exception e){
e.printStackTrace();
}
}

}


//MyTest.java
import java.io.*;
public class MyTest {

public static void main(String[] args) throws Exception {
// TODO: Add your code here
//BufferedReader bfr=new BufferedReader(new InputStreamReader(System.in));//这句如果写到while循环内,会出现问题。因为每循环一次都会新创建一个BufferedReaderd输入流对象而没有关闭代码,会占用大量资源,积累到一定程度就会出现丢失数据的问题!
while(true){
BufferedReader bfr=new BufferedReader(new InputStreamReader(System.in));//这句如果写到
String str=bfr.readLine();//当管道结束时,readLine()返回null,而不会抛出异常
if(str==null) //防止父进程结束时,子进程仍然运行。
return;
System.out.println("hi:"+str);
}
}
}


提高程序的运行效率:

for(int i=0;i<str.length();i++){
.......
}
要比
int len=str.length();
for(int i=0;i<len;i++){
.......
}
效率低。

byte [] buf=new byte[1024];
while(true){
对buf元素的操作语句
}
要比
while(true){
byte [] buf=new byte[1024];
对buf元素的操作语句
}
的效率高。因为第二种写法,每循环一次都要新建一个字节数组,降低了效率,并且占用内存。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: