Java 一行行读大文件,读的过程中删除文件,竟然还能继续读剩下的?

2023-04-26 12:37:52 +08:00
 albin504
package io;

import java.io.*;
import java.util.concurrent.TimeUnit;

public class InodeTest {
    public static void main(String[] args) throws IOException, InterruptedException {
        BufferedReader reader = new BufferedReader(new FileReader("/Downloads/2020.zip"), 2);
        String line;
        while ((line = reader.readLine()) != null) {
            System.out.println(line);
            TimeUnit.MILLISECONDS.sleep(10);
        }
    }
}

这个文件有几百兆,程序执行一会儿,我删除 2020.zip 这个文件(从回收站也删了),竟然还能继续读到剩下的文件,为什么?

难道 java 一次性把文件内容都加载到进程中了吗?

3634 次点击
所在节点    Java
26 条回复
si
2023-04-26 15:06:20 +08:00
文件还在使用的时候不会释放空间。
我遇到过服务器的硬盘空间满了,但现有的文件大小又对不上。
执行`lsof |grep deleted` 发现 MySQL 有大量显示 deleted 状态的文件,最后重启 MySQL 就释放了。
albin504
2023-04-26 15:55:06 +08:00
@si 我们业务上也遇到到类似问题,你这一提醒,我意识到我们当时也是这么回事。
springwood
2023-04-27 07:49:22 +08:00
任何一种编程语言好像都是这样的
xuanbg
2023-04-27 09:22:10 +08:00
删除文件相当于把你家的住址从地址簿上删掉了,但你家没搬走,我还是可以直接上门的。
moyechen
2023-06-02 09:59:46 +08:00
@albin504 #18
看了一下,应该是 FileReader 会将整个文件内容加载到内存中,然后进行读取操作。所以 echo 清空文件也是不行的
moyechen
2023-06-02 10:40:58 +08:00
@moyechen #25 我专门下了个 jdk ,echo 后,读取停止了的😅

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/935599

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX