首页 > 解决方案 > 如何通过偏移读取更改的文本文件

问题描述

例如,有一个文本文件。

文本文件更改。

test.txt = abcde

1分钟后

test.txt = cdefg
(a,b be deleted / f,g add)

在这种情况下,我将所有过去的文件读到e.

所以我想读取f当前文件的。(这是一个例子,没有人知道会出现什么词。)

我搜索我读到的最后一个单词并进行偏移的方式是不可能的,因为存在重复的可能性。

我会很感激你的帮助:)

标签: javafileinputstreambufferedreader

解决方案


答案将取决于文件系统语义和缓冲区的使用。Java 运行在操作系统之上,该操作系统提供了一个称为“文件”的抽象,java 通过其自己的 API(withFileInputStream等)公开该抽象。

如果您使用的是BufferedReader,则该阅读器有一个缓冲区,它存储从实际文件中读取的任何内容的内存副本(由底层操作系统报告)。因此,如果您在 Java 之外更改文件上的内容,则无法保证您的阅读器将返回最新的、新鲜的版本——而不是前一阵子读入缓冲区的任何内容。

获取新鲜内容的安全方法是:

  1. 关闭文件
  2. 再次打开它
  3. 寻找你想阅读的位置,阅读内容。

即使那样,您也不能完全保证获得真正新鲜的内容,因为它取决于操作系统处理写入的方式(这又可能取决于文件所在的设备:网络共享与旋转磁盘不同...... )。在一个应用程序认为它已将内容写入磁盘(或更糟:将其写入尚未刷新到磁盘的内部缓冲区)与实际文件被完全写出并准备好读取之间可能存在延迟其他。请注意完全强调:如果您在文件仍在其他地方写入时阅读它们,则可以获得部分更新的文件版本

这是人们使用数据库的原因之一:它们保证您永远不会获得部分更新的版本(通过使用事务和原子更新)。有比文件更好的方法在同一台机器上通信两个应用程序;例如,考虑使用套接字。


推荐阅读