java - java FileDescriptor .sync() 用于*读取*文件的逆向

标签 java multithreading file-io concurrency

阅读有关 FileDeciptor 的 .sync() 方法的 javadoc,很明显,sync() 主要涉及将任何修改的缓冲区提交回底层存储。即,确保您的程序具有输出的任何内容实际上都会将其发送到磁盘(或套接字或您拥有的东西,但我的问题主要与磁盘有关)。

但是另一个方向呢,INPUT呢?假设我的程序在内存中缓冲了 java.io.RandomAccessFile 的某些部分,并且我想读取文件的这些部分,但自上次我的程序读取这些 block 以来,也许其他进程已经修改了文件的这些部分?

这类似于在 C 程序中将变量标记为“ volatile ”;其他东西可能改变了你只是有一个方便的副本的东西的“真实版本”。

也就是说,您如何确定您的 java 程序读取的内容至少是最新的?

(显然“最新”的定义很重要。纯粹作为一个例子,假设另一个进程(写入文件的进程)大约每秒一次,并假设读取进程可能每分钟读取一次。在这种情况下,性能并不是什么大问题,只需确保读取器读取的内容与写入的内容一致(例如在一秒钟之内)。)

最佳答案

在重新读取文件之前,通常最好使用 File.lastModified() 检查文件的上次修改时间戳。如果此时间戳不比上次读取文件时更新,则无需费心使用更多磁盘 I/O 来重新读取您感兴趣的 block 。不过要记住的一件事是,如果您使用网络文件系统,则更新内容时,最后修改的时间戳可能并不总是立即更新。如果您正在处理更新文件的本地进程和运行代码读取文件的另一个本地进程,您很可能不会遇到此问题。

我过去成功使用的一种方法是让一个单独的线程以特定的时间间隔(例如 5 秒)轮询文件以获取最后修改的时间戳。如果文件发生更改,则重新处理该文件并向注册的监听器发送事件。就我而言,5 秒对于获取更新来说已经足够了。

关于java - java FileDescriptor .sync() 用于*读取*文件的逆向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1012932/

相关文章:

java - 在java中将30天添加到日期

java - Gson fromJson 返回空 JsonObject

java - 我应该在 Java 中使用哪个并发队列实现?

c# - System.Timers.Timer/Threading.Timer 与 Thread with WhileLoop + Thread.Sleep 用于周期性任务

c# - FileSystemWatcher 失败,创建了 1000 个文件

java - BufferedReader 无法读取日志文件中的新行

java - org.hibernate.exception.ConstraintViolationException : could not execute statement

java - 单击java中的DefaultMutableTreeNode时如何检测并显示所需的消息?

c++ - num++ 可以是 'int num' 的原子吗?

.net - 如何在 C# 2.0 中执行异步文件读取?