Java中的筛选器流的隐式协定是什么?

Cha*_*gsu 5 java stream

我正在读一本书《 Java网络编程(Elliotte Rusty Harold)》。在这段代码之后,我遇到了下面的句子。

FileInputStream fin = new FileInputStream("data.txt");
BufferedInputStream bin = new BufferedInputStream(fin);
Run Code Online (Sandbox Code Playgroud)

...对连接到同一源的不同流的混合调用可能会违反过滤器流的多个隐式协定。

并且下面的代码出来了。

InputStream in = new FileInputStream("data.txt");
in = new BufferedInputStream(in);
Run Code Online (Sandbox Code Playgroud)

我知道这简化了语法,但是我想知道“过滤器流的几个隐式协定”是什么意思。

ζ--*_*ζ-- 4

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

  • 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();
Run Code Online (Sandbox Code Playgroud)

您可能期望它byte1包含文件的第二个字节,但这是不正确的。当第一次填充缓冲区时,消耗BufferedInputStream的字节数远远超过一个字节,因此违反了关于流应该如何行为的典型隐式假设。

这并不是迄今为止唯一的示例 - 还要考虑两个不同的缓冲输入流正在使用同一输入文件的情况 - 不清楚两个缓冲区中的哪一个将获得任何特定字节,即使您的顺序缓冲区读取的数据是清晰的。