假设我有以下代码片段:
operation1();
bw.close();
operation2();
当我BufferedReader.close()
从我的代码调用时,我假设我的JVM进行系统调用,以确保缓冲区已被刷新并写入磁盘。我想知道是否close()
等待系统调用来完成其操作,或者它是否继续进行而operation2()
无需等待close()
完成。
为了重新解释我的问题,当我这样做时,我operation2()
能否认为bw.close()
已成功完成?
发布于 2018-10-25 09:24:42
由于以下原因,无法确定:
BufferedWriter是另一个Writer的包装器。BufferedWriter的close()只传播到底层的Writer。
如果这个底层Writer是一个OutputStreamWriter,并且如果OutputStream是一个FileOutputStream,那么close将发出一个系统调用来关闭文件句柄。
你完全可以自由地使用一个Writer,其中close()是noop,或者close是非阻塞实现的,但是当只使用java.io中的类时,情况绝对不是这样。
发布于 2018-10-25 10:38:50
java.io.BufferedReader.close()
如果满足,则完全取自合同的JavaDoc java.io.Reader
。
关闭流并释放与其关联的所有系统资源。流关闭后,进一步的read(),ready(),mark(),reset()或skip()调用将抛出IOException。关闭先前关闭的流无效。
虽然在文件系统完成之前没有明确声明阻塞,但是BufferedReader
如果close()
返回则所有其他操作的相同实例将抛出异常。虽然可以看出JavaDoc在操作完成的时候是模棱两可的,但如果文件系统刷新和关闭在此方法返回时未完成,则会违反合同的精神并成为Java(实现或文档)中的错误。
https://stackoverflow.com/questions/-100000883
复制相似问题