在获取Java文件对象之前,知道文件是否完整

在获取Java文件对象之前,知道文件是否完整,java,file,Java,File,我正在轮询文件系统以获取新文件,该文件是由某人从web界面上传的。 现在,我必须处理每个新文件,但在此之前,我想确保我正在处理的文件是完整的(我的意思是说它完全通过web界面传输) 如何在处理之前验证文件是否已下载完成?在大多数(如果不是所有)文件系统中,重命名文件名是一个原子操作。您可以通过将文件上载到一个可识别的临时名称,并在上载完成后立即对其进行重命名来利用此功能 通过这种方式,您将只“看到”那些已完全上传且可安全处理的文件。rsp的回答非常好。如果您的轮询代码在与保存文件的web服务器进

我正在轮询文件系统以获取新文件,该文件是由某人从web界面上传的。 现在,我必须处理每个新文件,但在此之前,我想确保我正在处理的文件是完整的(我的意思是说它完全通过web界面传输)


如何在处理之前验证文件是否已下载完成?

在大多数(如果不是所有)文件系统中,重命名文件名是一个原子操作。您可以通过将文件上载到一个可识别的临时名称,并在上载完成后立即对其进行重命名来利用此功能


通过这种方式,您将只“看到”那些已完全上传且可安全处理的文件。

rsp的回答非常好。如果您的轮询代码在与保存文件的web服务器进程不同的进程中运行,您可能希望尝试以下操作:


通常,在保存文件时,共享选项是“允许任何人读取”和“不允许任何人写入”。(独占写入。)因此,您也可以尝试使用独占写入访问打开文件:如果失败,则您知道web服务器仍保持文件打开状态,并向其写入。如果成功,那么您就知道web服务器已经完成。当然,一定要尝试一下,因为我不能保证这正是web服务器选择锁定文件的方式。

这取决于文件如何保存到磁盘。您使用的是哪种操作系统?这不是真正的黑客行为。除非上传过程锁定文件或文件具有可识别的文件结束标记,否则这是唯一的方法,并且是标准做法。甚至像firefox这样的浏览器也会做同样的事情(创建一个隐藏的*.part文件,然后重命名为预期的目标文件)。无论是否有其他方法,是否是标准做法,等等。所有这些都与是否是黑客无关。这是一种黑客行为,因为这样做的非黑客方式是询问操作系统“这个文件是别人打开的吗?”。尽管如此,这绝对是一个很好的黑客案例。遗憾的是,很多人使用的是非原子重命名的操作系统(Vista、ie XP之前的所有windows),我不知道Java API是否利用了在现代windows中进行原子重命名的可能性。但是,唯一真正的选择是以独占方式打开文件,java是否允许这样做?是的,我认为它允许。(这就是我的答案)这里有一个问题已经得到了回答(尽管没有被接受):我正在使用linux系统。我做了一个简单的实验,我试着把一个未完成下载的文件做成文件对象,通过java我可以处理这个文件。我想要的是在访问和处理文件之前检查文件是否完全下载的方法。如果我错了,请告诉我,我只是想用我所面对的实际案例来模拟torrent文件案例。在我的项目中,将有一些第三方上传的大型pdf文件,因此在处理它们之前,我只想确保文件完全上传到我的服务器。好的,如果您尝试以独占写入方式打开文件并成功,这意味着您的torrent客户端不会以独占写入方式打开相同的文件。这并不意味着web服务器的工作方式相同;在web服务器上,它可能会成功。