【问题标题】:What's implicit contracts of the filter streams in java?java中过滤器流的隐式契约是什么?
【发布时间】:2019-08-05 19:43:49
【问题描述】:

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

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

【问题讨论】:

    标签: java stream


    【解决方案1】:

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

    • 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 在第一次填充缓冲区时消耗的字节多于一个字节,因此违反了关于流应该如何表现的典型隐含假设。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-30
      • 2013-04-27
      • 1970-01-01
      • 1970-01-01
      • 2011-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多