1

我有一个将由 shell 脚本更新的日志文件。这个shell脚本有很多操作,每次操作后都会更新文件,表示操作已经完成。现在,我需要从 servlet 中“监听”这个文件,并以与日志记录相同的方式将响应发送回最终用户(即操作 A 完成,操作 B 完成等等)。现在,如果 servlet 和 shell 脚本都尝试同时打开文件,我相信我会得到一些错误。在java中,我想我可以将它作为IOException处理并继续尝试读取文件,以便在shell脚本不更新文件时它可以工作。我应该如何在 shell 脚本中处理这个问题?如果我在java中以只读模式打开文件会有帮助吗?另请注意,shell 脚本只写不读,servlet 只读不读

此外,欢迎提出有关实施此工作流程的更好方法的建议。

4

2 回答 2

2

您使用的是 Java 7 吗?如果是这样,那么新的 Watcher 服务可能会为您工作。我没有亲自使用它,但想法是当文件/文件夹发生更改时,您会在代码中收到通知。这可能会使您的代码比简单地重复轮询文件更干净。

http://docs.oracle.com/javase/7/docs/api/java/nio/file/WatchService.html

于 2012-07-09T04:32:08.020 回答
0

由于您不能使用 WatchService,您可以使用file.lastModified().

如果您定期执行此操作,则可以比较结果,如果它们发生更改,则说明文件已被 shell 脚本修改。每次轮询时可能需要创建一个新的 File 对象,但由于根本没有打开文件进行读取,因此不会出现访问问题。

但是,即使您打开文件并比较其内容,也不会遇到任何访问问题,除非您的 shell 以独占访问权限打开文件。

于 2012-07-09T05:03:45.373 回答