如何通过偏移量读取更改的文本文件

时间:2019-06-11 06:22:50

标签: java file inputstream bufferedreader

例如,一个文本文件。

文本文件更改。

test.txt = abcde

1分钟后

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

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

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

搜索可能读到的最后一个单词并进行偏移的方法是不可能的,因为可能会重复。

感谢您的帮助:)

1 个答案:

答案 0 :(得分:0)

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

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

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

  1. 关闭文件
  2. 再次打开
  3. 寻找要阅读的位置,然后阅读内容。

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

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