java - Java 中 null(Input/Output)Stream API 的用例是什么?
问题描述
使用 Java 11,我可以将一个初始化InputStream
为:
InputStream inputStream = InputStream.nullInputStream();
但我无法理解
ie的潜在用例InputStream.nullInputStream
或类似 API 。OutputStream
OutputStream.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
,它确实更好地证明了测试用例的合理性。
解决方案
有时您希望有一个 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
推荐阅读
- css - 应用带有渐变的 CSS hue-rotate() 过滤器
- python - Turtle 中的主菜单
- algorithm - 压缩二进制文件
- plot - 如何扩展绘图边距以使 chorddiagram 不会剪切标签?
- oracle - 如何使用 macOS 在 SQLDeveloper 中创建用户?
- python - 如何对两个文件中的列进行求和和相乘?
- java - 在 findViewById(R.id.myListView) 上找不到符号
- reactjs - 如何使用标签式导航
- python - TypeError,send_mail() 缺少 1 个必需的位置参数:'recipient_list'
- php - PHP 7 升级未捕获的异常“错误”,消息“不能将字符串偏移量用作数组”