File file = new File("result.csv");
FileWriter fw = new FileWriter(file.getAbsoluteFile());
BufferedWriter bw = new BufferedWriter(fw);
如果我们在写入完成后不关闭缓冲的写入器对象会发生什么?我的意思是如果我们错过 bw.close() 怎么办?
最佳答案
如果您打开了许多文件,并且不关闭它们,一段时间后您的操作系统将无法打开更多文件。
此外,虽然您的 BufferedWriter 尚未被垃圾收集,但就您的操作系统而言,它正在写入的文件将保持打开状态。如果是 Windows,则在文件句柄关闭之前您将无法删除该文件,无论是通过 BufferedWriter 最终被垃圾回收还是通过 JVM 退出。
BufferedWriter.close()
将缓冲区刷新到底层流,因此如果您忘记flush()
并且不关闭,您的文件可能会没有您写给它的所有文字。BufferedWriter.close()
还会关闭包装的 Writer。当它是 FileWriter 时,这最终将关闭 FileOutputStream 并告诉操作系统您已完成对文件的写入。垃圾收集器将自动调用
close()
,不是在BufferedWriter
或包装的 FileWriter 上调用,而是在FileOuputStream
上调用。所以操作系统会很高兴,但你必须等待GC。但是,您总是希望在不再需要操作系统资源时立即释放它们。这适用于打开的文件、数据库连接、打印队列......任何东西。相信我这一点。
BufferedWriter.close()
确实会清除内部字符缓冲区,以便内存可用于垃圾回收,即使BufferedWriter
本身仍保留在范围。
检查here了解更多详情
关于Java 缓冲写入器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22141777/