为了账号安全,请及时绑定邮箱和手机立即绑定

java中过滤流的隐式契约是什么?

java中过滤流的隐式契约是什么?

冉冉说 2023-05-17 17:39:25
我正在读一本书“Java 网络编程(Elliotte Rusty Harold)”。在这段代码之后,我遇到了以下句子。FileInputStream fin = new FileInputStream("data.txt"); BufferedInputStream bin = new BufferedInputStream(fin);...混合调用连接到同一源的不同流可能会违反过滤器流的多个隐式合同。而下面的代码就出来了。InputStream in = new FileInputStream("data.txt"); in = new BufferedInputStream(in);我知道这简化了语法,但我想知道“过滤器流的几个隐式合同”是什么意思。
查看完整描述

1 回答

?
qq_笑_17

TA贡献1818条经验 获得超7个赞

如果多个过滤器流连接到同一个源流,那么这些过滤器流可能会以不兼容的方式运行。想象一下,假设有两个流:

  • BufferedInputStream:包含缓冲区的流过滤器(例如合并读取)

  • NoChangeInputStream:在我的例子中,我什至不需要对我的一个过滤器流有特殊的行为。此类仅将所有 I/O 委托给基础输入流,不进行过滤。

现在想象运行以下代码:

InputStream in = new FileInputStream("data.txt");

BufferedInputStream buf = new BufferedInputStream(in);

NoChangeInputStream nop = new NoChangeInputStream(in);

int byte0 = buf.read();

int byte1 = nop.read();

您会期望它byte1包含文件的第二个字节,但这是不正确的。当它BufferedInputStream第一次填充其缓冲区时,消耗的不仅仅是一个字节,因此违反了一个人关于流应该如何表现的典型隐含假设。


到目前为止,这不是唯一的例子——还要考虑两个不同的缓冲输入流正在使用同一个输入文件的情况——不清楚两个缓冲区中的哪一个会得到任何特定的字节,即使你输入的顺序是从缓冲区读取是清楚的。


查看完整回答
反对 回复 2023-05-17
  • 1 回答
  • 0 关注
  • 120 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信