有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

FileInputStream fin = new FileInputStream("data.txt");
BufferedInputStream bin = new BufferedInputStream(fin);

...intermixing calls to different streams connected to the same source may violate several implicit contracts of the filter streams.

下面的代码出来了

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

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


共 (1) 个答案

  1. # 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第一次填充其缓冲区时,它消耗的字节远不止一个,因此违反了关于流应该如何运行的典型隐式假设

    这并不是唯一考虑的例子,也就是两个不同缓冲的输入流消耗相同的输入文件的情况下,不清楚这两个缓冲区中的哪一个将得到任何特定的字节,即使从EEM>中读取EME>缓冲区的顺序是清晰的。p>