Java 为什么BufferedWriter在关闭时抛出异常,如果它';已经关门了吗?
根据JavaDoc forJava 为什么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
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