文件删除后FileInputStream仍能读取的原因是什么?
为什么删除文件后仍能通过已打开的FileInputStream读取内容?
这是类Unix文件系统(你用到的/tmp目录通常属于这类系统)的特性导致的:
- 文件的目录条目(就是文件夹里显示的文件名)和实际数据存储是相互独立的。文件名本质是指向文件inode的一个链接,inode中记录了文件的元数据(权限、大小、数据块位置等)以及指向实际数据块的指针。
- 当你调用
file.delete()时,操作系统仅删除了这个目录条目,同时把inode的链接计数减1。但只要还有进程持有该文件的打开文件描述符(比如你代码里提前创建的FileInputStream就持有这个描述符),inode就不会被销毁,对应的磁盘数据块也不会被标记为可复用。 - 因此你的
FileInputStream依然能通过文件描述符找到对应的inode和数据块,正常读取文件内容,直到这个流被关闭、链接计数降到0,操作系统才会真正回收inode和数据块,释放磁盘空间。
对应你的代码流程:
- 先创建
FileInputStream打开/tmp/input,此时进程获取了该文件的打开句柄; - 调用
delete()删除文件名,仅移除了目录里的条目,但文件的实际数据仍保存在磁盘上; - 后续通过
IOUtils.copyLarge读取流时,依然能访问到未被回收的数据,所以能成功复制内容到output文件。
内容的提问来源于stack exchange,提问作者Anshita Singh
相关产品推荐
相关产品推荐

