Java 为什么BufferedWriter在关闭时抛出异常,如果它';已经关门了吗?

Java 为什么BufferedWriter在关闭时抛出异常,如果它';已经关门了吗?,java,stream,Java,Stream,根据JavaDoc forCloseable.close: 如果流已关闭,则调用此方法无效 但是,在对我的类型为BufferedWriter(实现Closeable)的对象调用close后,我收到以下错误: java.io.IOException: Stream closed at sun.nio.cs.StreamEncoder.ensureOpen(StreamEncoder.java:45) at sun.nio.cs.StreamEncoder.write(StreamE

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

来自

关闭流,首先冲洗流。一旦溪流关闭, 进一步的write()或flush()调用将导致出现IOException 扔。关闭以前关闭的流没有效果

特别声明您应该将可关闭标记为关闭

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


实际上,根据stacktrace,看起来您正在关闭一个
BufferedWriter

  • 是开放的,
  • 仍然具有缓冲数据,并且
  • 包装已关闭的基础流
  • 发生的情况是,在
    BufferedWriter
    上调用
    close()
    会导致它尝试刷新其余字符。如果包装的流/写入程序已关闭,则无法执行此操作


    如果使用
    缓冲写入程序
    包装
    写入程序
    输出流
    ,则不应直接在包装的写入程序/流上调用
    close()

    在这种情况下,
    写入程序
    似乎尚未关闭。试图关闭它是引发异常的原因。好吧,
    Closeable
    的“流”指的是对象本身,而不是任何底层流不确定这如何回答我的问题?
    BufferedWriter
    的JavaDoc从这个意义上反映了
    Closeable
    的文档。
    public void close()
           throws IOException