Java 文件流没有关闭的情况下使用delete方法

727 阅读1分钟

这两天碰到一个奇怪的case。

场景:

在下载文件的过程中,停止下载,删除文件,接着重新下载。(文件的地址是一样的,文件越大越容易复现)

问题:

虽然删除了文件,delete方法返回的也是true,看目录发现文件确实被删除了,但是通过无限循环发现,文件对应的内存空间没有被释放掉。

解决:

通过断点发现,底层下载文件的库在停止下载的时候先删除文件,后关闭流。这个顺序有问题,所以导致了delete的虽然返回了true,但实际上文件的流还没有关闭,所以文件所在的空间并没有释放。如果这时候再创建文件就会抛异常。

更新:

经过仔细阅读底层下载库,发现还有一个问题,使用了MappedByteBuffer去写入文件,这个类是nio中的,他只有 map方法,没有unmap方法,导致空间只能在gc的时候释放。这个类在我们目前的业务使用不太合适,所以改为传统的io操作。

详细解释可以参考:

stackoverflow.com/questions/3…