【问题标题】:drain() vs flush() in ObjectOutputStream Class in JavaJava 中 ObjectOutputStream 类中的 drain() 与 flush()
【发布时间】: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


【解决方案1】:

问题一:

如果我调用oout.flush(),,它将强制将ObjectOutputStream 中的输出数据写入底层FileOutputStream,,但不能保证这些数据随后会从FileOutputStream 写入文件“ test.txt”在磁盘中,因为我不调用out.flush(),对吗?

不,你错了。它确实刷新了FileOutputStream。但是,由于FileOutputStream 没有缓冲或刷新,实际上drain()flush() 在这种情况下没有区别。如果在FileOutputStream 周围有一个BufferedOutputStream,就会有所不同。

问题 2:

如果我打电话给oout.drain()怎么办?将执行哪些处决?

它会刷新ObjectOutputStream,但不会刷新底层流,正如它在 Javadoc 中所说的那样。

您以某种方式设法使这完全回到了前面。我不明白怎么做:Javadoc 很清楚。另外,drain()protected,反正这不关你的事。

【讨论】:

  • 所以根据你的回答,如果我将 BufferedOutputStream 包裹在 FileOutputStream 周围,drain() 只会刷新 ObjectOutputStream,而 flush() 将同时刷新 ObjectOutputStream 和不延迟的 BufferedOutputStream。这是正确的吗?
  • 详细说明所有可能的场景毫无意义。 '它将刷新ObjectOutputStream 但不会刷新底层流'这句话是完全足够的。
【解决方案2】:

Flush 会将数据写入 test.txt。但是,drain 与 flush 类似,但不会将 flush 传播到底层流。

【讨论】:

  • 谢谢。但我想知道它是如何执行的,而不是 java 文档中的脚本或描述。
  • @Clemont 它的执行方式与“Java 文档描述”中的描述完全相同。这就是他们的目的。
猜你喜欢
  • 2016-02-03
  • 1970-01-01
  • 2015-01-03
  • 2012-08-08
  • 2015-11-20
  • 1970-01-01
  • 2018-12-09
  • 1970-01-01
  • 2015-01-05
相关资源
最近更新 更多