为什么BufferedWriter在关闭时抛出异常?

时间:2016-01-20 15:09:51

标签: java stream

根据Closeable.close的JavaDoc:

  

如果流已经关闭,则调用此方法无效。

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

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的合同相矛盾。我错过了什么吗?

2 个答案:

答案 0 :(得分:12)

实际上,根据堆栈跟踪,您似乎正在关闭BufferedWriter

  1. 已开启,
  2. 仍有缓冲数据,
  3. 包装已关闭的基础流。
  4. close()上调用BufferedWriter会导致它尝试刷新剩余的字符。如果包装的流/写入器已关闭,则无法完成。

    如果您使用Writer包裹OutputStreamBufferedWriter,则不应直接在已打包的作者/流上调用close()

答案 1 :(得分:0)

来自the official documentation

public void close()
       throws IOException
     

关闭流,先冲洗它。流关闭后,   进一步的write()或flush()调用将导致IOException   抛出。关闭之前关闭的流无效。

Closeable Interface明确规定您应该将Closable标记为已关闭......

  

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