如果 BufferedWriter 已经关闭,为什么它会在关闭时引发异常?



根据 JavaDoc for Closeable.close

如果流已关闭,则调用此方法不起作用。

但是,在对我的类型 BufferedWriter 的对象(实现 Closeable )调用 close 后,我收到此错误:

java.io.IOException: Stream closed
    at sun.nio.cs.StreamEncoder.ensureOpen(StreamEncoder.java:45)
    at sun.nio.cs.StreamEncoder.write(StreamEncoder.java:118)
    at java.io.OutputStreamWriter.write(OutputStreamWriter.java:207)
    at java.io.BufferedWriter.flushBuffer(BufferedWriter.java:129)
    at java.io.BufferedWriter.close(BufferedWriter.java:264)

这似乎与Closeable的合同相矛盾。我错过了什么吗?

实际上

,根据堆栈跟踪,您似乎正在关闭一个BufferedWriter

  1. 是开放的,
  2. 仍然有缓冲的数据,并且
  3. 包装已关闭的基础流。

发生的情况是,在BufferedWriter上调用close()会导致它尝试刷新剩余字符。 如果包装的流/编写器已关闭,则无法执行此操作。

如果您使用BufferedWriter包装WriterOutputStream,则不应直接在包装的编写器/流上调用close()

来自官方文档

public void close()
       throws IOException

关闭流,先冲洗它。一旦流关闭, 进一步的 write() 或 flush() 调用将导致 IOException 扔。关闭以前关闭的流不起作用。

Closeable界面特别指出,您应该将可关闭标记为已关闭...

如 AutoCloseable.close() 中所述,关闭可能失败的情况 需要仔细注意。强烈建议放弃 基础资源,并在内部将可关闭标记为已关闭, 在抛出 IOException 之前。

相关内容

  • 没有找到相关文章

最新更新