gpt4 book ai didi

java - 用于*读取*文件的java FileDescriptor .sync() 的转换

转载 作者:行者123 更新时间:2023-12-03 12:57:59 25 4
gpt4 key购买 nike

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

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

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

即,您如何确定您的 Java 程序读取的内容至少是最新的?

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

最佳答案

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

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

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com