根据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
的合同相矛盾。我错过了什么吗?
答案 0 :(得分:12)
实际上,根据堆栈跟踪,您似乎正在关闭BufferedWriter
:
在close()
上调用BufferedWriter
会导致它尝试刷新剩余的字符。如果包装的流/写入器已关闭,则无法完成。
如果您使用Writer
包裹OutputStream
或BufferedWriter
,则不应直接在已打包的作者/流上调用close()
。
答案 1 :(得分:0)
public void close() throws IOException
关闭流,先冲洗它。流关闭后, 进一步的write()或flush()调用将导致IOException 抛出。关闭之前关闭的流无效。
Closeable
Interface明确规定您应该将Closable标记为已关闭......
如AutoCloseable.close()中所述,关闭可能会失败的情况 需要小心注意。 强烈建议放弃 底层资源并在内部将Closeable标记为已关闭, 在抛出IOException之前。