File类踩坑记录
背景
有一天运维突然告诉我,生产服务器下面的目录文件满了,我表示一脸蒙,去服务器一看,才发现确实是非常多的文件,那这个是怎么产生的呢?我们一起来研究一下。
在Java中,File 类的 delete 和 deleteOnExit 方法有不同的用途和行为:
file.delete()
- 作用:立即删除文件或目录。
- 返回值:如果删除成功,返回
true,否则返回false。这可能由于文件不存在、没有权限或文件被其他进程占用等原因。 - 使用场景:当你需要实时删除文件或目录,可以立即使用这个方法。
file.deleteOnExit()
- 作用:在程序终止时自动删除文件。也就是说,文件会在 JVM 退出时被删除,而不是立即。
- 返回值:无返回值。该方法只是将文件的删除请求标记为在应用关闭时执行。
- 使用场景:通常用于需要临时文件的情况,比如创建一些不再需要的临时文件并希望在程序结束时自动清理。
而我代码中也正是调用的file.deleteOnExit()方法,所以导致在springboot项目中,并没有给我及时的删除,进而导致服务在运行一段时间后,保留了大量的临时文件。
顺带复习一下如何在linux服务器上删除制定类型的文件:
在Linux中,可以使用命令行工具来删除指定类型的文件。最常用的工具是 find 和 rm 命令。以下是一些示例:
使用 find 命令删除指定类型的文件
-
删除特定扩展名的文件(例如
.txt):find /path/to/directory -type f -name "*.txt" -delete -
删除多个扩展名的文件(例如
.log和.tmp):find /path/to/directory -type f \( -name "*.log" -o -name "*.tmp" \) -delete -
按照文件大小或修改时间删除文件:
-
删除大于100MB的文件:
find /path/to/directory -type f -size +100M -delete -
删除修改时间超过30天的文件:
find /path/to/directory -type f -mtime +30 -delete
-
使用 rm 结合通配符删除
-
删除当前目录中的所有
.jpg文件:rm *.jpg -
删除子目录及当前目录中的所有
.log文件:rm -r *.log
小心使用
-
使用
-delete操作时要非常小心,最好先用-print查看将要删除的文件:find /path/to/directory -type f -name "*.txt" -print -
注意彻底删除后,文件将无法恢复
