如何在 Java 中读取文件 updated/modified?

How to read file as it gets updated/modified in Java?

我正在尝试监控“.txt”文件并在使用以下方法更新时从中读取数据。

public void startFileMonitoring() throws InterruptedException {
        log.info("Here");
        
        String filePath = "file.txt";
        File file = new File(filePath);
        long lastModified = -1;
        
        do {
            try {
                if (lastModified != file.lastModified()) {
                     
                    RandomAccessFile in = new RandomAccessFile(filePath, "r");
                    String data = in.readLine();
                    
                    log.info("Read Data : "+data+"\tdata length : "+data);
                    lastModified = file.lastModified();
                    in.close();
                }
            } catch (IOException e) {
                log.error("Exception while reading file");
                e.printStackTrace();
            }
            
        }while(true);
        
    }

有趣的是,这个方法能够正确读取 lastModified 时间。因此,每当我们更新文件中的任何内容时,它都会尝试读取该文件。 问题是,它不获取任何数据(给出空值)。

我错过了什么?

日志:文件最初有字符串“abc”。我把它改成了“abcd”。

2021-04-01 10:44:06.929  INFO 12760 --- [         task-1] com.service.FileReadingService     : Read Data : abc
2021-04-01 10:44:11.626  INFO 12760 --- [         task-1] com.service.FileReadingService     : Read Data : null
2021-04-01 10:44:18.402  INFO 12760 --- [         task-1] com.service.FileReadingService     : Read Data : null

非常奇怪的解决方案。调试时尝试打印 RandomAccess in 的对象引用并且代码有效。

这里是更新的代码:

public void startFileMonitoring(){
        log.info("Here");
        
        String filePath = "file.txt";
        File file = new File(filePath);
        long lastModified = -1;
        
        do {
            try {
                if (lastModified != file.lastModified()) {

                    RandomAccessFile in = new RandomAccessFile(filePath, "r");
                        //in.seek(0L);
                        log.info("in : {}",in);
                        String data = in.readLine();
                        
                        if(data == null) {
                            log.info("Data null here, in: {}",in);
                        }

                        if (data != null && applicationData.getSeenLinesFromFile().add(data)) {
                            applicationData.getLineDataToRead().add(data);
                        }

                        log.info("Read Data : " + data+"\tfile : "+file+"\tlasModified : "+lastModified);
                        lastModified = file.lastModified();
                    
                }
            } catch (IOException e) {
                log.error("Exception while reading file");
                e.printStackTrace();
            }
            
        }while(true);
        
    }