我有一个Java应用程序,它监视传入XML文件的文件夹.检测到新文件时,我需要测试文件当前未更新并关闭.我的想法是使用File.canWrite()来测试它.这样做有什么问题吗?这是测试文件是否已完全写入的好方法吗?
我投掷的其他想法是:
解析传入的XML文件并测试结束标记是否存在.
检查EoF角色.
我只是不确定这些方法中的任何一种都能处理所有场景.
不,canWrite不适用于此目的.通常,即使另一个进程正在编写,该文件也是可写的.
您需要更高级别的协议来协调锁定.如果您计划在单个平台上使用此代码,则可以使用NIO的FileLock工具.但请仔细阅读文档,并注意在许多平台上,锁只是建议性的.
另一种方法是让一个进程使用您的进程无法识别的名称写入文件,然后在写入完成时将文件重命名为可识别的名称.在大多数平台上,如果源和目标是相同的文件系统卷,则重命名操作是原子操作.名称更改可能使用不同的文件扩展名,甚至可以将文件从一个目录移动到另一个目录(在同一卷上).
因为在这种情况下你只使用XML,所以查找一个close标签是可行的,但它并不是万无一失的 - 如果在最终标记之后有注释,或者编写器还是根本没有编写有效的XML?
寻找EOF将无法正常工作.即使作者刚刚打开文件并且还没有写入任何内容,总会有EOF.如果不是这样,最简单的方法就是让读者在文件出现后立即开始解析; 它会直接阻止,直到作者关闭文件.但是文件系统不能以这种方式工作.即使某个进程正在移动它,每个文件都有结束.