黑马程序员——流对象之管道流,黑马程序员
分享于 点击 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("管道写入流失败");
}
}
}
运行结果: 由运行结果可知:管道输入流和管道输出流是多线程同时运行的,如果管道读取流线运行的话,运行到读取的时候就等待,等到数据写入完成后就开始读取数据。 以上就是对管道流的一个大概描述。
相关文章
- 暂无相关文章
用户点评