io流

来源:互联网 发布:手机像素画图软件 编辑:程序博客网 时间:2024/06/05 09:23

------- android培训、java培训、期待与您交流! ----------

在集合中涉及到IO流的是Properties

在IO流中涉及到多线程技术的是管道流

管道流就是将输入流当做输出流的写入目的地
将输出流当做输入流的读取源

管道流:PipedOutputStream, PipedInputStream
可以将管道输出流连接到管道输入流来创建通信管道。管道输出流是管道的发送端。
通常,数据由某个线程写入 PipedOutputStream 对象,并由其他线程从连接的 PipedInputStream 读取。
不建议对这两个对象尝试使用单个线程,因为这样可能会造成该线程死锁。
如果某个线程正从连接的管道输入流中读取数据字节,但该线程不再处于活动状态,则该管道被视为处于 毁坏 状态

PipedOutputStream 的write在写完后要关闭流,不然会抛出 write dead错误。

通过connect(PipedOutputStream src) 将输入和输出连接到一起

---------------
PipedOutputStream 中的public void write(byte[] b,
       int off,
       int len)
       throws IOException
将 len 字节从初始偏移量为 off 的指定 byte 数组写入该管道输出流。在将所有字节写入输出流之前,此方法一直处于阻塞状态。

管道流的输出流并不像其他IO流一样将数据写入到硬盘上的文件,而是将数据写入到了流本身,这个流本身之所以能被写入数据是
因为在输入流中有一个1024大小的循环缓冲区。

PrintStream ps = new PrintStream(pipedOS);
System.setOut(ps);
System.setErr(ps);

将标准输出流设置为PrintStream,将原来要打印到控制台的信息输出到PrintStream流中
再通过PrintStream流将数据原样写入到管道流的输出流中(输入流的循环缓冲区)
------------------------------
PipedInputStream运用的是一个1024字节固定大小的循环缓冲区。写入PipedOutputStream的数据实际上保存到对应的 PipedInputStream的内部缓冲区。
从PipedInputStream执行读操作时,读取的数据实际上来自这个内部缓冲区。如果对应的 PipedInputStream输入缓冲区已满,任何企图写入PipedOutputStream的线程都将被阻塞。
而且这个写操作线程将一直阻塞,直至出现读取PipedInputStream的操作从缓冲区删除数据。
-------------------------------

 ------- android培训、java培训、期待与您交流! ----------   详细请查看:http://edu.csdn.net/heima/

原创粉丝点击