我正在读一本书《 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);

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

最佳答案

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

  • BufferedInputStream :一个流过滤器,其中包含一个缓冲区(例如,合并读取)
  • NoChangeInputStream :在我的示例中,我甚至不需要为其中的一个过滤器流采取特殊的行为。此类仅将所有I/O委托(delegate)给基础输入流,而不进行过滤。

  • 现在想象一下运行以下代码:
    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第一次填充缓冲区时消耗了不止一个字节,因此违反了人们关于流应该如何行为的典型隐式假设。

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

    关于java - Java中的筛选器流的隐式协定是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57365147/

    10-09 20:34