1

在 Java 8+ 中轮询/读取一个小的纯 ASCII 文件以检查它是否已更改的开销最小的方法是什么?

我有一个创建虚假文件系统 (ev3dev) 的设备,该设备提供带有状态更新的小型只读文件。(例如,乐高电机在position具有单个 Int 的文件中的位置,或电机在status具有单个字符串的文件中的状态,都作为纯 ASCII 文件提供)

没用的东西:

  1. 我认为Java 的 Watcher 服务不起作用,因为从未通知操作系统文件已更改。(修改时间保持不变,文件大小不变。)我试过了——它永远不会触发。那好吧!
  2. 设置一个mark()andreset()一遍又一遍地读取文件而不创建新的 Reader 似乎不适用于 BufferedReader,有没有办法让它工作?

我想我必须轮询:一遍又一遍地快速阅读文件(一遍又一遍!)

  • 我可以使用内存映射文件(它会接受更改吗?)
  • 有什么方法可以让所有东西都保持打开状态并进行标记/重置或类似操作以获取更改?
  • 还是硬着头皮在自己的线程中调用 Files.readAllBytes,循环之间有 1ms 的延迟?
4

1 回答 1

1

您可以将 RandomAccessFile 类用于您的代码。

我的代码:

import java.io.*; //Importing RandomAccessFile Class
import java.util.*; // Thread.sleep(milliseconds)
public class Main {
    public static void main(String[] args) throws Exception {
        Scanner scan = new Scanner(System.in);
        /*Just To add functionality I have also specified the time at which the file is modified*/
        System.out.println("Input File Path : ");
        String file_path = scan.nextLine();
        RandomAccessFile f = new RandomAccessFile(file_path,"r");
        int character;
        String Intitalval="";
        while ((character = f.read()) != -1) {
            Intitalval+=(char)character;
        }
        f.seek(0);
        boolean nochange = true;
        while (nochange) {
            String ToCompare="";
            while ((character = f.read()) != -1) {
                ToCompare+=(char)character;
            }

            if (!ToCompare.equals(Intitalval)) {
                nochange = false;
                System.out.println("The file has been modified at " + java.time.LocalTime.now());
            }
            Thread.sleep(1);
            f.seek(0);
        }
        f.close();
    }
}

正如您所说,您想要延迟 1 毫秒,我使用了 javaThread.sleep(int milliseconds)方法。

该程序还将显示文件被修改的时间(不准确(+- 毫秒))。

输出 :

输出/结果

于 2020-07-28T05:25:09.307 回答