Java在写入一致性文件时移动文件

Java在写入一致性文件时移动文件,java,file-io,operating-system,Java,File Io,Operating System,我的java应用程序应该读取Debian服务器上Snort应用程序的日志数据。 Snort应用程序独立于我的评估应用程序运行,并将其日志写入文件。 我的评估应用程序应该每5分钟检查一次新内容。这就是为什么我要移动日志文件,这样Snort应用程序就必须创建一个新文件,而我的应用程序可以检查旧文件中已经写入的数据 现在的问题是:如何确保在这种情况下不破坏文件,在Snort应用程序写入文件时立即移动文件?Java是否具有检查文件当前操作的功能,以便不会丢失数据?操作系统在写入时是否锁定文件 谢谢你的帮

我的java应用程序应该读取Debian服务器上Snort应用程序的日志数据。 Snort应用程序独立于我的评估应用程序运行,并将其日志写入文件。 我的评估应用程序应该每5分钟检查一次新内容。这就是为什么我要移动日志文件,这样Snort应用程序就必须创建一个新文件,而我的应用程序可以检查旧文件中已经写入的数据

现在的问题是:如何确保在这种情况下不破坏文件,在Snort应用程序写入文件时立即移动文件?Java是否具有检查文件当前操作的功能,以便不会丢失数据?操作系统在写入时是否锁定文件


谢谢你的帮助,Kn0rK3不完全是你想要的,但我会用一种完全不同的方式来做。通过记录从日志文件中读取的最后一个条目的行号/时间戳或a中的位置(第二个选项由于明显的原因更有效),并且,下次读取文件时,只从记录的位置执行此操作,直到
EOF
(此时您可以再次记录上次读取的位置)

此外,对于此文件策略,您可以将“每5分钟池一次”替换为“每次我获得a时池一次”


因为我假设您无法控制“Snort”应用程序的代码,所以我认为NIO s不会帮助您。

这不应该是一个问题。通常,日志应用程序具有某种文件描述符或文件流。如果文件被重命名,这不会以任何方式影响写入应用程序——名称与文件内容或其在磁盘上的位置无关。Snort应该继续写入新文件名,直到它注意到该文件已被重命名,此时它将以旧名称重新打开一个新日志文件,并切换到写入该文件

这就是它重新开放的全部原因。支持这种机制

现在的问题是:在这种情况下,我如何确保不销毁文件

您唯一需要担心的是,您正在将文件重命名为一个不存在的文件名。我建议将其移动到
.YYYYMMDD.HHMMSS
扩展名或其他位置


注意:在线程日志记录操作中,即使新文件已打开,您也可能需要等待一段时间,等待所有线程切换到新的日志记录流。我不确定Snort是如何工作的,但我看到即使在重新打开
log
文件之后,
log.YYYYMMDD
文件仍在增长。在使用重命名的日志文件之前,我只需等待一分钟。仅供参考。

没错。我无法控制Snort应用程序的代码。而且每次更新都要阅读不是个好主意。Snort应用程序是本地大学网络的网络控制应用程序。一分钟内可能会有很多写作动作。我明白了,所以最好像你现在这样保持一个共享时间。但对于第一部分,我认为使用RandomAccessFile进行位置查找的成本可以忽略不计,您可以以只读方式打开该文件。这意味着,我首先移动/重新命名该文件,等待一分钟,以便写入最后的条目,然后再评估数据,而snort应用程序将使用旧名称创建新文件并添加新条目。非常感谢。是的,那应该行。您可能会更好:重命名文件,观察Snort创建的新文件,等等,处理旧文件。对我的答案有什么反馈吗?如果这对你有帮助,请接受它。