Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在java中检测文件的增长?_Java_File_Asynchronous_Concurrency_Nio - Fatal编程技术网

如何在java中检测文件的增长?

如何在java中检测文件的增长?,java,file,asynchronous,concurrency,nio,Java,File,Asynchronous,Concurrency,Nio,我从头到尾都在阅读文件的内容(通常使用FileInputStream进行阅读,但我不受此限制) 当我读取文件时,其他进程可能会附加到该文件中。 这不是问题,只要我在读文件。 但当我完成时,我需要每个文件有一个线程等待输入(阻止读取),或者尝试定期读取文件(轮询) 我更愿意为Sockets使用select之类的功能,但据我所知,FileChannels总是阻塞 我想归档的内容有点像Linux命令行上的tail-f。我需要知道什么时候有更多的数据需要读取…没有一种单一、可靠的方法可以确保一个正在运

我从头到尾都在阅读
文件
的内容(通常使用
FileInputStream
进行阅读,但我不受此限制)

当我读取文件时,其他进程可能会附加到该文件中。 这不是问题,只要我在读文件。 但当我完成时,我需要每个文件有一个线程等待输入(阻止读取),或者尝试定期读取文件(轮询)

我更愿意为
Socket
s使用
select
之类的功能,但据我所知,
FileChannels
总是阻塞



我想归档的内容有点像Linux命令行上的
tail-f
。我需要知道什么时候有更多的数据需要读取…

没有一种单一、可靠的方法可以确保一个正在运行的进程能够访问附加到该文件的数据。在大多数操作系统中,诸如文件大小之类的属性往往被缓存在多个级别上。在操作系统缓存之上,JVM还将缓存文件属性

这就是本地主机上的本地文件系统的全部功能。在网络或分布式文件系统中,缓存“隐藏”文件更新可能更难处理

要访问新附加到已经打开的文件中的数据,您必须通过所有缓存,如何进行缓存是操作系统的问题,通常甚至是特定于文件系统的问题,因此您不能在常规中使用Java进行缓存-即使JVM本身没有缓存属性,它也会这样做


我发现Java中唯一可靠的方法是关闭文件并重新打开它。您可以编写一些JNI代码来绕过任何JVM属性缓存,甚至操作系统缓存,以查看文件是否已增长,因此,您可以确定是否必须关闭并重新打开该文件。

但是可以制作一个java.nio.channels.Selector来告诉您何时可以在一个或多个文件上执行某个操作,而无需阻塞一个特定的文件读取操作。(不限于套接字-另请参见man-s 2 select。)这就是您要查找的内容吗?我不确定这是否可行,因为两个文件无法同时访问,但可能会有所帮助。一个写入程序和一个或多个读卡器不应引起问题。但我不确定我是否理解OP的问题陈述。搜索“java尾巴”给了我答案。对于简单的检测,a应该足够了。