Java移动文件一边写一致

时间:2012-02-22 15:13:39

标签: java file-io operating-system

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

现在的问题是:我怎样才能确保我不会破坏文件,我会在Sno​​rt应用程序写入的时候移动它? Java是否具有检查文件当前操作的功能,以便不会丢失任何数据?操作系统在写入时是否锁定文件?

感谢您的帮助,Kn0rK3

2 个答案:

答案 0 :(得分:1)

不完全是你想要的,但我会以一种非常不同的方式做到这一点。通过记录从日志文件读取的最后一个条目的行号/时间戳或RandomAccessFile中的位置(第二个选项因显而易见的原因更有效),并在下次读取文件时,仅从记录的位置到EOF(你可以再次记录最后一个阅读位置)。

此外,您可以每隔5分钟更换一次""每当我得到一个update notification"到一个"池对于这个文件策略。

因为我认为你无法控制" Snort"申请,我不认为NIO FileLock会帮助你。

答案 1 :(得分:1)

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

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

  

现在的问题是:我如何确保在案件中不销毁文件......

您唯一需要担心的是您要将文件重命名为尚不存在的文件名。我建议将其移至.YYYYMMDD.HHMMSS扩展名或其他内容。

注意:在线程日志记录操作中,即使打开了新文件,您也可能需要等待所有线程切换到新的日志记录流。我不确定Snort是如何工作的,但即使重新打开log.YYYYMMDD文件,我也看到log文件正在增长。我只是等了一会儿才能使用重命名的日志文件。 FYI。