IO流结构图
FilterInputStream、FilterOutputStream
FilterInputStream、FilterOutputStream 过滤器字节输入流、输出流,这里用到了装饰器模式,它的主要用途在于给一个对象动态的添加功能。
当我们在创建FilterInputStream、FilterOutputStream这两个类的实例时需要传入一个InputStream、OutPutStream的子类,比如:当构造FilterOutputStream时传递进去的是FileOutputStream,而FileOutputStream和FilterOutputStream实现的是同一个抽象类OutputStream,那么FilterOutputStrean对FileOutputStream的装饰对于客户端来说就是透明的,可以在FileOutputStream的方法执行之前或之后加上一些额外的操作来达到装饰的效果。
FilterInputStream、FilterOutputStream仅仅是对InputStream、OutputStream中所有方法进行了重写,并且只是调用传入的InputStream、OutputStream子类的方法,话句话说就是没有对传入的低级字节输入流进行任何的装饰,它们的作用是为所有字节输入流的装饰类提供一个标准、一个类似于接口的作用,具体的装饰功能由FilterInputStream、FilterOutputStream的子类来完成。
缓冲流
缓冲输出流都提供了flush方法,用以将缓冲数组中的内容输出至文件,close方法内部调用了flush方法,当缓冲数组中被填满时,也会自动将内容写入到硬盘中。
关闭流时由于缓冲流的close方法内部执行了被装饰流的close方法,所以在关闭流时,只需执行缓冲流的关闭方法即可。
BufferedInputStream额外提供的方法为void mark(int readlimit) 和 void reset() throws IOException,缓冲字符流也具有这些功能
它的作用就是在当前位置作1个标记, 它允许调用另1个方法reset() 令到流重新定位到这个标记上.
BufferedReader常用的额外提供的方法有readline(),即读取一行字符,不包括换行符,如果已到达流末尾,则返回null。
BufferedWriter常用的额外提供的方法有newline(),即开启新的一行。
转换流
OutputStreamWriter字符输出流
OutputStreamWriter(OutputStream out):根据默认编码把字节流的数据转换为字符流
OutputStreamWriter(OutputStream out,String charsetName):根据指定编码把字节流数据转换为字符流
InputStreamReader字符输入流
InputStreamReader(InputStream is):用默认的编码读取数据
InputStreamReader(InputStream is,String charsetName):用指定的编码读取数据
序列流
SequenceInputStream
序列流,对多个流进行合并。
SequenceInputStream表示其他输入流的逻辑串联。它从输入流的有序集合开始,并从第一个输入流开始读取,直到到达文件末尾,接着从第二个输入流读取,依次类推,直到到达包含的最后一个输入流的文件末尾为止。
构造函数
SequenceInputStream(InputStream s1, InputStream s2)
SequenceInputStream(InputStream s1, InputStream s2)
ObjectOutputStream和ObjectInputStream
打印流
PrintStream可以接受文件和其他字节输出流,所以打印流是对普通字节输出流的增强,其中定义了很多的重载的print()和println(),方便输出各种类型的数据。
PrintStream:
是一个字节打印流,System.out对应的类型就是PrintStream。
它的构造函数可以接收三种数据类型的值。
1,字符串路径。
2,File对象。
3,OutputStream。
PrintWriter:
是一个字符打印流。构造函数可以接收四种类型的值。
1,字符串路径。
2,File对象。
对于1,2类型的数据,还可以指定编码表。也就是字符集。
3,OutputStream
4,Writer