Java 防止和检测删除打开的文件

Java 防止和检测删除打开的文件,java,file,delete-file,Java,File,Delete File,我的Java程序打开一个文件并缓慢地写入该文件。操作完成后,程序关闭文件并将文件移动到另一个目录中的最终静止位置。问题是,当操作运行时,同一Java程序中的另一个线程会删除该文件 Windows不允许在文件打开时删除该文件。Linux允许在打开时删除文件。在NFS文件系统上,Linux将重命名该文件,然后在文件关闭时自动删除该文件。如何防止在文件打开时删除文件 如何确定删除文件的内容?如何在删除文件的程序中获取Java线程的调用堆栈 更改文件所有者将不起作用,因为同一进程中的另一个线程正在删除该

我的Java程序打开一个文件并缓慢地写入该文件。操作完成后,程序关闭文件并将文件移动到另一个目录中的最终静止位置。问题是,当操作运行时,同一Java程序中的另一个线程会删除该文件

Windows不允许在文件打开时删除该文件。Linux允许在打开时删除文件。在NFS文件系统上,Linux将重命名该文件,然后在文件关闭时自动删除该文件。如何防止在文件打开时删除文件

如何确定删除文件的内容?如何在删除文件的程序中获取Java线程的调用堆栈

更改文件所有者将不起作用,因为同一进程中的另一个线程正在删除该文件

程序正在主动写入文件,因此删除文件的写入权限将不起作用。删除该目录的写入权限也将不起作用,因为该目录还有其他正在创建和删除的文件


该程序有185k行代码。在整个代码中有许多对
File.delete()
的调用。我可以在
File.delete()
Files.delete()
等上设置断点。但是,程序正在快速创建和删除大量文件。这将产生大量断点命中,从而将指针埋在大海捞针中。我可以将断点设置为有条件的,但是程序将运行得非常慢。

更改文件的权限是一个好主意吗?Unix文件权限可以很容易地限制为单个用户。创建一个用户并从该用户运行JVM。在Linux上,如果文件在打开时被删除,Linux将重命名该文件,然后在文件关闭时自动删除该文件。通常不会。POSIX类型的系统通常只是立即删除文件的目录项。某些文件系统(NFS)的行为确实如您所述,但这并不正常。在Unix中,文件删除或更确切地说取消链接需要对包含目录的写入权限,而不是文件本身。(
rm
不带
-f
提示,如果您没有对文件进行写入,但如果您确认,则会成功。)但是如果您正在创建文件(和目录条目)(通过打开它),则需要对目录进行写入@Stewart:OP说这是同一java进程中的另一个线程,你不能通过用户ID来隔离它。@Stewart我做了一个全局查找,并检查了
File.delete()
的所有100个用法。他们中的一些人可以删除有问题的文件,但很难说他们是否删除了。我为每一个添加了一些日志语句。。。现在运行代码,等待问题在一天左右的时间内重现。