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
-
注意彻底删除后,文件将无法恢复