Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/383.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
可以使用Java文件方法吗;canWrite();支持锁定?_Java_Xml_File Io - Fatal编程技术网

可以使用Java文件方法吗;canWrite();支持锁定?

可以使用Java文件方法吗;canWrite();支持锁定?,java,xml,file-io,Java,Xml,File Io,我有一个Java应用程序,它监视文件夹中传入的XML文件。当检测到新文件时,我需要测试该文件是否当前未更新且已关闭。我的想法是用来测试这个。这样做有什么问题吗?这是测试文件是否已完全写入的好方法吗 我提出的其他想法包括: 解析传入的XML文件并进行测试 结束语标签在那里 检查EoF字符 我只是不确定这些方法是否能处理所有场景。不,canWrite不适合用于此目的。通常,即使另一个进程正在写入,该文件也是可写的 您需要更高级别的协议来协调锁定。如果您计划在单个平台上使用此代码,则可以使用。但是

我有一个Java应用程序,它监视文件夹中传入的XML文件。当检测到新文件时,我需要测试该文件是否当前未更新且已关闭。我的想法是用来测试这个。这样做有什么问题吗?这是测试文件是否已完全写入的好方法吗

我提出的其他想法包括:

  • 解析传入的XML文件并进行测试 结束语标签在那里
  • 检查EoF字符

我只是不确定这些方法是否能处理所有场景。

不,canWrite不适合用于此目的。通常,即使另一个进程正在写入,该文件也是可写的

您需要更高级别的协议来协调锁定。如果您计划在单个平台上使用此代码,则可以使用。但是请仔细阅读文档,并注意在许多平台上,锁只是建议性的

另一种方法是让一个进程使用进程无法识别的名称写入文件,然后在写入完成后将文件重命名为可识别的名称。在大多数平台上,如果源卷和目标卷是相同的文件系统卷,则重命名操作是原子的。名称更改可能使用不同的文件扩展名,甚至可能将文件从一个目录移动到另一个目录(在同一卷上)

因为在本例中,您只使用XML,所以查找关闭标记是可行的,但如果在最终标记后有注释,或者编写器或根本不编写有效的XML,这并不是万无一失的


寻找EOF将不起作用。将始终存在EOF,即使编写器刚刚打开文件并且尚未编写任何内容。如果不是这样的话,最简单的方法是允许读者在文件出现时就开始解析;它会一直阻塞,直到编写器关闭文件。但是文件系统不是这样工作的。每个文件都有一个结尾,即使某个进程当前正在移动它。

据我所知,无法判断另一个进程当前是否有来自Java的文件的打开句柄。一个选项是使用新io中的类。这在所有平台上都不受支持,但如果文件是本地的,并且写入文件的过程相互配合,则这应该适用于任何支持锁定的平台。

此外,如果先执行检查,然后执行写入,则存在争用条件。状态可能在检查和写入之间发生变化。有时候,最好尝试做你想做的事情,优雅地处理错误。可能是一种n尝试重试机制,具有增加的回退延迟时间

或者重新定义你的测试。在本例中,您可能需要测试文件大小在处理之前的一段时间内是否没有更改


另一种选择是将代码一分为二,您可以有另一个线程(可能是quartz任务)负责将完成的文件移动到主代码处理的不同目录中。

如果您同时控制读写器,然后,一种潜在的锁定技术是为读写过程持续时间创建一个锁目录——这通常是一个原子操作。如果采用这种方法,则必须管理导致“挂起”锁定目录的进程的潜在故障

正如Cheekysoft提到的,文件不是原子的,不适合锁定


如果您不控制writer(例如,如果它是由FTP守护进程生成的),那么重命名技术或延时时间跨度技术是您的最佳选择。

在Windows中似乎有效的一件事是 -创建一个File()对象,该对象表示有问题的文件(使用具有完整文件名的构造函数) -以相同的方式创建第二个相同的文件对象。 -尝试使用firstFile.renameTo(第二个文件)

对于其他应用程序(我用Word测试过)未打开以供编辑的文件,此虚拟重命名练习似乎成功了,但如果文件打开,则失败

由于nw文件名=旧文件名,因此不会创建任何其他工作