我有一个将由shell脚本更新的日志文件。此shell脚本具有许多操作,并在每次操作后更新文件,表示操作已完成。现在,我需要从servlet“监听”该文件,并以与记录发生相同的方式将响应发送回最终用户(即操作A完成,操作B完成等等)。现在,如果servlet和shell脚本同时尝试打开文件,我相信我会收到一些错误。在java中,我想我可以将其作为IOException处理并继续尝试读取该文件,以便在shell脚本不更新文件时它可以正常工作。我应该如何处理shell脚本?如果我在java中以只读模式打开文件会有帮助吗?另请注意,shell脚本只写入和不读取,并且servlet只读取和不写入。
此外,建议欢迎更好地实施此工作流程。
答案 0 :(得分:2)
您使用的是Java 7吗?如果是这样,那么新的Watcher服务可能适合您。我没有亲自使用它,但想法是当文件/文件夹发生变化时,您会在代码中收到通知。这可能会使您的代码比仅仅重复轮询文件更清晰。
http://docs.oracle.com/javase/7/docs/api/java/nio/file/WatchService.html
答案 1 :(得分:0)
由于您无法使用WatchService,因此可以使用file.lastModified()
轮询上次修改的文件。
如果定期执行此操作,则可以比较结果,如果更改,则shell脚本会修改该文件。每次轮询时可能都需要创建一个新的File对象,但由于文件未打开以便完全读取,因此不会出现访问问题。
但是,即使您打开文件并比较其内容,也不会遇到任何访问问题,除非您的shell打开具有独占访问权限的文件。