首先上在网上找的InputStream和OutputStream的类图结构
下面的是Reader 和Writer 的类图结构
挑重点的讲解一下
1.ByteArrayInputStream和ByteArrayOutputStream
顾名思义,字节输入流和字节输出流,ByteArrayInputStream( ) 在构造输入流的时候传进去的是字节数组,通过read()或者read(byte[] b, int off, int len)
方法读取单个字符,如果读到结尾返回-1.第二种是一次读取字节数组,而不是一个一个的读.
ByteArrayOutputStream 字节数组输出流在内存中创建一个字节数组缓冲区,所有发送到输出流的数据保存在该字节数组缓冲区中
没有带参的构造函数,有两个方法write(int b)和write(byte[] b, int off, int len)
方法, 将字节数组的参数传进去,通过ByteArrayOutputStream.write( )方法将字节数组 输出到内存的字节数组缓冲区中.
可以通过toByteArray()方法返回字节数组,writeTo(OutputStream out) 将缓冲区的字节数组写进 out 对象中
2.FileInputStream和FileOutputStream
最常用的IO流,FileInputStream(File f),File作为数据源,通过read() 单个读取字节,或者通过read(byte[ ] b)每次读取一个字节数组的长度.
FileOutputStream(File f),通过write(byte[ ] b),write(int b)方法将字节数组或字节写入文件输出流. 这样可以实现文件的写操作.
3.PipedInputStream 和 PipedOutputStream
管道输入流和输出流,主要的作用是实现线程之间的输入和输出操作
管道输入流应该连接到管道输出流;管道输入流提供要写入管道输出流的所有数据字节。通常,数据由某个线程从 PipedInputStream
对象读取,并由其他线程将其写入到相应的 PipedOutputStream
。不建议对这两个对象尝试使用单个线程,因为这样可能死锁线程。管道输入流包含一个缓冲区,可在缓冲区限定的范围内将读操作和写操作分离开。如果向连接管道输出流提供数据字节的线程不再存在,则认为该管道已损坏。
在一个线程中通过PipedOutputStream的write()方法写进输入流,然后 在另一个线程中使用PipedInputStream.read()方法将输出流的内容读出来.
他们之间通过PipedOutputStream的connect(PipedInputStream in)或者PipedInputStream的connect(PipedInputStream out)方法关联,实现 线程之间的流的传输.
4.SequenceInputStream
序列输入流:表示其他输入流的逻辑串联。它从输入流的有序集合开始,并从第一个输入流开始读取,直到到达文件末尾,接着从第二个输入流读取,依次类推,直到到达包含的最后一个输入流的文件末尾为止。
有两个构造方法 SequenceInputStream(Enumeration<? extends InputStream> e) 和
SequenceInputStream(InputStream s1, InputStream s2)
要么是个输入流类型 的枚举类 或者 两个输入流 将枚举类或者 两个输入流 合并
5.BufferedInputStream 和 BufferedOutputStream
int read(byte[] b, int off, int len)
从此字节输入流中给定偏移量处开始将各字节读取到指定的 byte 数组中。
返回的是读取的字节数.
处理流,节点流的inputStream传进来,进行装饰,实现更强大的功能,缓冲流主要是加一个默认为8192字节的缓存,放在内存中,通过flush()或者close(),将缓存一次性写到文件对象或字节数组对象中.或者一次性读到应用程序中 ,如果在inputStream 中的read(byte[ ] b) b的大小和8192一样大,效率和BufferedInputStream 差不多 . 还有点不同的是inputstream 的read 方法是堵塞的,而bufferedinputStream 不是堵塞的.
BufferedOutputStream的write()方法
void write(byte[] b, int off, int len)
将指定 byte 数组中从偏移量 off
开始的 len
个字节写入此缓冲的输出流。
void write(int b)
将指定的字节写入此缓冲的输出流