根据 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
:
- 是开放的,
- 仍然有缓冲的数据,并且
- 包装已关闭的基础流。
发生的情况是,在BufferedWriter
上调用close()
会导致它尝试刷新剩余字符。 如果包装的流/编写器已关闭,则无法执行此操作。
如果您使用BufferedWriter
包装Writer
或OutputStream
,则不应直接在包装的编写器/流上调用close()
。
来自官方文档
public void close() throws IOException
关闭流,先冲洗它。一旦流关闭, 进一步的 write() 或 flush() 调用将导致 IOException 扔。关闭以前关闭的流不起作用。
Closeable
界面特别指出,您应该将可关闭标记为已关闭...
如 AutoCloseable.close() 中所述,关闭可能失败的情况 需要仔细注意。强烈建议放弃 基础资源,并在内部将可关闭标记为已关闭, 在抛出 IOException 之前。