我正在从头到尾阅读File
的内容(通常会对FileInputStream
这样做,但我不限于此)。
当读取文件时,其他进程可能会附加到该文件中。这不是问题,只要我从文件中读取。但是当我完成后,我需要为每个文件设置一个线程等待输入(阻塞读取)或尝试定期读取文件(轮询)。
我更愿意使用select
之类的Socket
s,但就我发现有关该主题的信息FileChannels
总是阻塞…
我想要归档的东西有点像Linux命令行上的tail -f
。我需要知道什么时候有更多的数据读取…
没有单一的、可靠的方法来确保具有打开文件的运行进程能够访问附加到该文件的数据。在大多数操作系统中,文件大小等属性倾向于在几个级别上进行缓存。除了操作系统缓存之外,JVM还将缓存文件属性。
以上就是本地主机上的本地文件系统。在网络或分布式文件系统中,缓存"隐藏"文件更新可能更难处理。
要访问新添加到已经打开的文件中的数据,您必须跳过所有缓存,并且如何做到这一点是操作系统甚至文件系统特定的,所以您不能在中通用在Java中做到这一点-即使JVM本身没有缓存属性,它也会缓存。
我发现Java中唯一可靠的工作方法是关闭文件并重新打开它。您可以编写一些JNI代码来绕过任何JVM属性缓存,甚至操作系统缓存,以查看文件是否已经增长,这样您就可以发现是否必须关闭并重新打开文件。