首页 > 解决方案 > Java 中 null(Input/Output)Stream API 的用例是什么?

问题描述

使用 Java 11,我可以将一个初始化InputStream为:

InputStream inputStream = InputStream.nullInputStream();

但我无法理解 ie的潜在用例InputStream.nullInputStream或类似 API 。OutputStreamOutputStream.nullOutputStream

从 API Javadocs,我可以弄清楚它

返回一个InputStream读取字节的 new 。返回的流最初是打开的。通过调用 close() 方法关闭流。

后续调用close()无效。当流打开时,available(), read(), read(byte[]), ... skip(long)transferTo()方法都表现得好像已经到达流的末尾。

我进一步阅读了详细的发行说明,其中指出:

有很多时候,我想使用需要目标 OutputStream/Writer 作为参数的方法来发送输出,但想静默执行这些方法以获得其他效果。

这对应于 Unix 中将命令输出重定向到 /dev/null 或在 DOS 中将命令输出附加到 NUL 的能力。

但是我不明白语句中的那些方法是什么,如....默默地执行这些方法以获得其他效果。(怪我缺乏对 API 的实际操作)

如果可能的话,有人可以帮助我理解拥有这样一个输入或输出流的用处吗?


编辑:我可以在进一步浏览时找到的类似实现之一是 apache-commons'NullInputStream,它确实更好地证明了测试用例的合理性。

标签: javainputstreamapache-commonsoutputstreamjava-11

解决方案


有时您希望有一个 InputStream 类型的参数,但也希望能够选择不向您的代码提供任何数据。在测试中,模拟它可能更容易,但在生产中,您可以选择绑定null 输入if,而不是使用s 和标志分散代码。

相比:

class ComposableReprinter {
    void reprint(InputStream is) throws IOException {
        System.out.println(is.read());
    }

    void bla() {
        reprint(InputStream.nullInputStream());
    }
}

有了这个:

class ControllableReprinter {
    void reprint(InputStream is, boolean for_real) throws IOException {
        if (for_real) {
            System.out.println(is.read());
        }
    }
    void bla() {
        reprint(new BufferedInputStream(), false);
    }
}

或这个:

class NullableReprinter {
    void reprint(InputStream is) throws IOException {
        if (is != null) {
            System.out.println(is.read());
        }
    }
    void bla() {
        reprint(null);
    }
}

恕我直言,输出更有意义。输入可能更多是为了保持一致性。

这种方法称为空对象https ://en.wikipedia.org/wiki/Null_object_pattern


推荐阅读