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
本身仍在作用域中,内存也可以用于垃圾收集。
查看此处了解更多详细信息