java io 管道

转载:http://ifeve.com/java-io-%e7%ae%a1%e9%81%93/

Java IO中的管道为运行在同一个JVM中的两个线程提供了通信的能力。所以管道也可以作为数据源以及目标媒介。

你不能利用管道与不同的JVM中的线程通信(不同的进程)。在概念上,Java的管道不同于Unix/Linux系统中的管道。

可以通过Java IO中的PipedOutputStream和PipedInputStream创建管道。一个PipedInputStream流应该和一个PipedOutputStream流相关联。一个线程通过PipedOutputStream写入的数据可以被另一个线程通过相关联的PipedInputStream读取出来。

package test.io.io;

import java.io.IOException;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;

/**
 * 测试Java io 创建管道
 * 同一个jvm 的同一个进程的多个线程可以通过io管道相关联,
 * 当使用两个相关联的管道流时,务必将它们分配给不同的线程。read()方法和write()方法调用时会导致流阻塞,这意味着如果你尝试在一个线程中同时进行读和写,可能会导致线程死锁。
 * 用两个管道共有的connect()方法使之相关联。PipedInputStream和PipedOutputStream都拥有一个可以互相关联的connect()方法。
 * 参考:http://ifeve.com/java-io-%e7%ae%a1%e9%81%93/
 * @author 12198
 *
 */
public class PipeExample {
	
	
	public static void main(String[] args) throws IOException {
		final PipedOutputStream out = new PipedOutputStream();
		final PipedInputStream input = new PipedInputStream(out);//使他们相关联
		input.connect(out);//connect 相关联
		Thread thread = new Thread(new Runnable() {
			public void run() {
				try {
					out.write("Hello Piper".getBytes());
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		});	
		thread.start();
		
		Thread thread2 = new Thread(new Runnable() {
			
			@Override
			public void run() {
				// TODO Auto-generated method stub
				try {
					int a =input.read();
					while(a != -1) {
						System.out.println((char)a);
						a = input.read();
					}
					out.flush();
					input.close();
					out.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		});
		thread2.start();
		
	}

}

猜你喜欢

转载自blog.csdn.net/kzcming/article/details/82387210