【发布时间】:2018-04-13 08:11:11
【问题描述】:
当我看到下面关于这两种方法的描述时,我对它们感到有些困惑。
protected void drain():类似于flush,但不会将flush传播到底层流。
void flush():写入任何缓冲的输出字节并刷新到底层流。
例如:
FileOutputStream out = new FileOutputStream("test.txt");
ObjectOutputStream oout = new ObjectOutputStream(out);
问题 1:
如果我调用oout.flush(),它将强制将 ObjectOutputStream 中的输出数据写入底层 FileOutputStream,但不能保证这些数据随后会从 FileOutputStream 写入磁盘中的文件“test.txt”因为我不打电话给out.flush(),这样对吗?
问题 2:
如果我打电话给oout.drain()怎么办?
- 将执行哪些处决?
【问题讨论】:
-
好吧,对于初学者来说,
drain()是受保护的,而不是公开的,所以它只被设计为由子类调用。换句话说,它是类内部实现的一部分。 -
是的,我只是想知道它将如何执行。这是关于实施细节。
-
以后如果有这样的问题,谷歌“grecode java
”也无妨。 Grepcode 是一个网站,列出了许多开源项目的源代码,包括 JDK。如果我对某些东西的实现方式有疑问,我通常会先检查那里。 -
所以在这样做之后,
drain()实际上所做的似乎是底层 IO 流的write()。您不能依赖他们在未来保持内部实现相同,但是阅读源代码可以让 imo 更好地了解原始实现者在编写方法和文档时的想法。这很方便知道。
标签: java