8 Java程序与其它进程的数据通信
2012-07-17 21:51
399 查看
Java程序与其它进程的数据通信
在Java程序中可以用Process类的实例对象来表示子进程,子进程的标准输入和输出不再连接到键盘和显示器,而是以管道流的形式连接到父进程的一个输出流和输入流对象上。
调用Process类的getOutputStream和getInputStream方法可以获得连接到子进程的输出流和输入流对象。
编程实例:在TestInOut类中启动java.exe命令执行另外一个MyTest类,TestInOut和MyTest通过进程间的管道相互传递数据。
关于使用Java程序与其它进程的数据通信时管道已结束的问题
这个程序包含两个类:TestInOut.java与MyTest.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) {
......
}
在Java程序中可以用Process类的实例对象来表示子进程,子进程的标准输入和输出不再连接到键盘和显示器,而是以管道流的形式连接到父进程的一个输出流和输入流对象上。
调用Process类的getOutputStream和getInputStream方法可以获得连接到子进程的输出流和输入流对象。
编程实例:在TestInOut类中启动java.exe命令执行另外一个MyTest类,TestInOut和MyTest通过进程间的管道相互传递数据。
关于使用Java程序与其它进程的数据通信时管道已结束的问题
这个程序包含两个类:TestInOut.java与MyTest.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) {
......
}
相关文章推荐
- 黑马程序员--java程序与其它进程的数据通信
- java 程序与其它进程的数据通信
- 第7讲 IO/输入与输出-Java程序与其它进程的数据通信
- (转)Java程序与其它进程的数据通信
- Java程序与其它进程的数据通信
- 黑马程序员-JAVA学习第7课-Java程序与其它进程的数据通信
- Java程序与其它进程的数据通信
- IO 输入与输出(9)-- Java程序与其他进程的数据通信
- java程序与其他进程的数据通信
- Java IO 系列----Java程序与其他进程的数据通信
- JAVA程序与其他进程的数据通信
- JAVA高级视频_IO输入与输出 Java程序与其他进程的数据通讯 学习笔记
- [疯狂Java]I/O:标准流重定向、JVM读写其它进程数据
- Java.java程序与其他进程的通信
- 用C#调用Windows API和其它进程通信及C# 获得另外一程序 句柄 后控制该程序 控制其透明 窗体大小
- JAVA高级视频_IO输入与输出 Java程序与其他进程的数据通讯 学习笔记
- Android NDK开发篇(四):Java与原生代码通信(原生方法声明与定义与数据类型)
- Chapter17— Memory-Mapping Files 进程间共享数据进行通信
- java程序控制台输入数据的一种方法
- java16 程序、进程、线程