过滤器流
过滤器有两个版本:过滤器流及reader阅读器和writer书写器。过滤器流仍然主要将原始数据作为字节操作:例如通过压缩数据或解释为二进制数字。reader和writer处理各种编码文本的特殊情况,如UTF-8和ISO-8859.过滤器流置于原始流(如FileOutputStream)或其他过滤器流之上。reader和writer置于原始流、过滤器流或其他reader和writer之上。但是过滤器流不能置于reader和writer上面。
过滤器以链的形式进行组织,链中的每个环节都接收前一个过滤器或流的数据,并把数据传递给链中的下一个环节。
网络->TelnetInputStream->BufferedInputStream->CipherInputStream->GZIPInputStream->InputStreamReader->App
每个过滤器输出流都有与java.io.OutputStream相同的write、close和flush方法;每个过滤器输入流都有与java.io.InputStream相同的read、close和available方法。过滤纯粹是内部操作,不提供任何新的公共接口。但是,在大多数情况下,过滤器流添加了另外一些公共方法。
将过滤器链接到一起
过滤器通过其构造函数与流链接。比如
FileInputStream fin = new FileInputStream("data.txt");
BufferedInputStream bin = new BufferedInputStream(fin);
在此之后,从文件data.txt中读取文本可能会同时使用fin和bin的read方法。但是,如果混合使用链接到同一个源的不同流,这可能会违反过滤器流的一些暗定的约定。大多数情况下,我们应该只使用作用链中最后一个过滤器进行实际的读写。有意的丢掉对底层输入流的引用。
<span style="font-size:18px;">BufferedInputStream bin = new BufferedInputStream(new FileInputStream("data.txt"));</span>
如果需要超类中没有的方法,可以直接在一个流中构建另外一个流。
<span style="font-size:18px;"> DataOutputStream dout = new DataOutputStream(new BufferedOutputStream(new FileOutputStream("data.txt"));</span>
这种连接时永久的,过滤器无法和流断开连接。
PS: 第一次发图片,搞了N次,还好发布上去了。