8 Java程序与其它进程的数据通信

本文介绍了一个Java程序如何通过创建子进程并与之进行数据交换的方法。示例代码展示了父进程TestInOut.java与子进程MyTest.java之间的通信过程。讨论了在实际运行过程中遇到的“管道已结束”错误,并提供了可能的原因及解决思路。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


Java程序与其它进程的数据通信

在Java程序中可以用Process类的实例对象来表示子进程,子进程的标准输入和输出不再连接到键盘和显示器,而是以管道流的形式连接到父进程的一个输出流和输入流对象上。

调用Process类的getOutputStreamgetInputStream方法可以获得连接到子进程的输出流和输入流对象。

编程实例:在TestInOut类中启动java.exe命令执行另外一个MyTest类,TestInOutMyTest通过进程间的管道相互传递数据。

关于使用Java程序与其它进程的数据通信时管道已结束的问题

这个程序包含两个类:TestInOut.javaMyTest.java

TestInOut.java作为父进程,MyTest.java作为子进程。

TestInOut.java中使用Process类调用Runtime.getRuntime().exec("java MyTest")函数来启动子进程并获得一个Process对象。不知为什么,运行时老是报错,说是管道已结束,弄了好久,现在还没搞清楚。请高手们帮我看看是什么原因,怎么改,谢谢!

两个类的代码如下:

TestInOut.java

import java.io.*;

public class TestInOut implements Runnable{

Process p = null;

public TestInOut() {

try {

p = Runtime.getRuntime().exec("java MyTest");

catch (IOException e) {

e.printStackTrace();

}

new Thread(this).start();

}

public static void main(String[] args)  {

TestInOut tio = new TestInOut();

tio.send();

}

public void send() {

try{

OutputStream os = p.getOutputStream();

BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os));

while (true) {

bw.write("help\r\n".toCharArray());

}

catch (IOException e) {

e.printStackTrace();

}

}

public void run()  {

InputStream is = p.getInputStream();

BufferedReader br = new BufferedReader (new InputStreamReader(is));

String str = null;

try{

while(true) {

str = br.readLine();

if(str != null) {

System.out.println(str);

else {

return;

}

}

catch (IOException e) {

e.printStackTrace();

}

}

}

MyTest.java

import java.io.*;

public class MyTest {

public static void main(String[] args) throws IOException {

 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;

}

}

}

}

运行结果:

java.io.IOException: 管道已结束。

at java.io.FileOutputStream.writeBytes(Native Method)

at java.io.FileOutputStream.write(FileOutputStream.java:260)

at java.io.BufferedOutputStream.write(BufferedOutputStream.java:105)

at sun.nio.cs.StreamEncoder$CharsetSE.writeBytes(StreamEncoder.java:336)

at sun.nio.cs.StreamEncoder$CharsetSE.implWrite(StreamEncoder.java:395)

at sun.nio.cs.StreamEncoder.write(StreamEncoder.java:136)

at java.io.OutputStreamWriter.write(OutputStreamWriter.java:191)

at java.io.BufferedWriter.flushBuffer(BufferedWriter.java:111)

at java.io.BufferedWriter.write(BufferedWriter.java:181)

at java.io.Writer.write(Writer.java:104)

at com.srong.inout.TestInOut.send(TestInOut.java:26)

at com.srong.inout.TestInOut.main(TestInOut.java:18)

提高程序的运行效率

1

for(int i = 0; i < str.length(); i ++){

......

int len = str.length()

for(int i = 0; i < len; i ++){

......

(2)

while(true) {

byte [] buf = new byte[1024];

......

}

byte [] buf = new byte[1024];

while(true) {

......

}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值