欢迎访问悦橙教程(wld5.com),关注java教程。悦橙教程  java问答|  每日更新
页面导航 : > > 文章正文

黑马程序员——流对象之管道流,黑马程序员

来源: javaer 分享于  点击 35883 次 点评:75

黑马程序员——流对象之管道流,黑马程序员


------Java培训、Android培训、java学习型博客、期待与您交流! -------   流对象管道流之PipedInputStream和PipedOutputStream 一、管道流概述:        管道输入流PipedInputStream:管道输入流应该连接到管道输出流;管道输入流提供要写入管道输出流的所有数据字节。通常,数据由某个线程从 PipedInputStream 对象读取,并由其他线程将其写入到相应的 PipedOutputStream。不建议对这两个对象尝试使用单个线程,因为这可能死锁线程。管道输入流包含一个缓冲区,可在缓冲区限定的范围内将读操作和写操作分离开。如果向连接管道输出流提供数据字节的线程不再存在,则认为该管道已损坏。        管道输出流PipedOutputStream:可以将管道输出流连接到管道输入流来创建通信管道。管道输出流是管道的发送端。通常,数据由某个线程写入 PipedOutputStream 对象,并由其他线程从连接的 PipedInputStream 读取。不建议对这两个对象尝试使用单个线程,因为这样可能会造成该线程死锁。如果某个线程正从连接的管道输入流中读取数据字节,但该线程不再处于活动状态,则该管道被视为处于毁坏状态。        管道流的作用:我们发现,除了管道流之外的其他一些流对象,读取流和输出流之间需要一个中转站,就是我们所说的字节数组。写数据的时候写到某个字节数组中,读数据的时候又从这个字节数组中读取出来。但是管道流就不需要这个中转站,它是通过管道来进行操作的,读取数据是一个管道,写入数据又是一个管道,然后通过connect方法把这两个管道连接起来就可以进行数据的传输了。        建立:因为管道流都是和线程关联使用的,如果使用一个线程来就行读取操作的话,如果先运行读操作就会引起线程死锁,所以建议使用多线程。即读取数据一个线程,写入数据是另外一个线程。 二、管道流举例:        java代码:       
package it.heima;

import java.io.*;
public class PipedDemo {
	public static void main(String[] args) {
		try {
			PipedInputStream pis = new PipedInputStream();
			PipedOutputStream pos = new PipedOutputStream();
			//把管道输入流和管道输出流连接起来
			pis.connect(pos);
			PipedInputStreamDemo r = new PipedInputStreamDemo(pis);
			PipedOutputStreamDemo w = new PipedOutputStreamDemo(pos);
			//启动线程
			new Thread(r).start();
			new Thread(w).start();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

/**
 * 管道输入流
 */
class PipedInputStreamDemo implements Runnable {
	//定义私有成员变量,管道输入流pis
	private PipedInputStream pis;
	//构造方法,在创建对象的时候就初始化pis
	public PipedInputStreamDemo(PipedInputStream pis){
		this.pis = pis;
	}

	//复写run方法,并读取数据
	@Override
	public void run() {
		try {
			byte[] buf = new byte[1024];
			for (int i = 5; i >= 1; i--) {
				System.out.println("开始读取数据......"+i);
				new Thread().sleep(2000);
			}
			int len = pis.read(buf);
			String pipedStr = new String(buf,0,len);
			System.out.println("数据读取完成:"+pipedStr);
			pis.close();
		} catch (Exception e) {
			throw new RuntimeException("管道读取流失败");
		}
	}
}
/**
 * 管道输出流
 */
class PipedOutputStreamDemo implements Runnable{
	//定义私有成员变量,管道输出流pos
	private PipedOutputStream pos;
	//构造方法,在创建对象的时候就初始化pos
	public PipedOutputStreamDemo(PipedOutputStream pos) {
		this.pos = pos;
	}
	
	//复写run方法,并写入数据
	@Override
	public void run() {
		try {
			for (int i = 5; i >= 1; i--) {
				System.out.println("开始写入数据......" + i);
				new Thread().sleep(2000);
			}
			pos.write("管道流数据".getBytes());
			System.out.println("数据写入完成");
			pos.close();
		} catch (Exception e) {
			throw new RuntimeException("管道写入流失败");
		}
	}
	
}

       运行结果:   由运行结果可知:管道输入流和管道输出流是多线程同时运行的,如果管道读取流线运行的话,运行到读取的时候就等待,等到数据写入完成后就开始读取数据。 以上就是对管道流的一个大概描述。

相关文章

    暂无相关文章
相关栏目:

用户点评