Java程序与其它进程的数据通信
·在Java程序中可以用Process类的实例对象来表示子进程,子进程的标准输入和输出不再连接到键盘和显示器,而是以管道流的形式连接到父进程的一个输出流和输入流对象上。
·调用Process类的getOutputStream和getInputStream方法可以获得连接到子进程的输出流和输入流对象。
·编程实例:在TestInOut类中启动java.exe命令执行另外一个MyTest类,TestInOut和MyTest通过进程间的管道相互传递数据。
import java.io.*;
public class TestInOut implements Runnable {
private Process p =null;
public TestInOut() {
try{
//p = Runtime.getRuntime().exec("java MyTest1");//为什么修改一下这个参数:MyTest1的时候在我的机器上运行程序会挂死,修改成:java 123的时候程序异常退出
p = Runtime.getRuntime().exec("java MyTest");
new Thread(this).start();
}
catch(Exception e){
e.printStackTrace();
}
}
/**
* Method main
*
*
* @param args
*
*/
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();
}
}
/**
* Method run
*
*
*/
public void run() {
// TODO: Add your code here
try {
InputStream in = p.getInputStream();
BufferedReader bfr = new BufferedReader(new InputStreamReader(in));
String strLine = "";
while(true){
strLine = bfr.readLine();
//System.out.println("fff:"+strLine);
if(strLine !=null){
System.out.println("re:"+strLine);
}else{
p.destroy();
return;
}
}
}
catch(Exception e){
e.printStackTrace();
}
}
}
import java.io.*;
public class MyTest {
/**
* Method main
*
*
* @param args
*
*/
public static void main(String[] args) throws Exception {
// TODO: Add your code here
BufferedReader bfr = new BufferedReader(new InputStreamReader(System.in));
String str = null;
while (true){
str = bfr.readLine();
if(str !=null){
System.out.println("hi:"+str);
}else{
return;
}
}
}
}
·验证管道缓冲区满后,将发生下面的哪种情况:验证的结果是(2)阻塞状态
(1)新的数据写入时,将最前面写入的数据挤出去,从而发生数据丢失。
(2)与PipedInputStream相连的PipedOutputStream无法再写入新的数据,PipedOutputStream.write方法处于阻塞状态。
(3)与PipedInputStream相连的PipedOutputStream无法再写入新的数据,PipedOutputStream.write方法抛出异常。
·记住调用Process类的destroy方法结束子进程的运行。