【问题标题】:how to read changing text-file through offset如何通过偏移读取更改的文本文件
【发布时间】:2019-06-11 06:22:50
【问题描述】:
例如,有一个文本文件。
文本文件更改。
test.txt = abcde
1 分钟后
test.txt = cdefg
(a,b be deleted / f,g add)
在这种情况下,我将所有过去的文件都读到e。
所以我想读取当前文件的f。
(这是一个例子,没有人知道会出现什么。)
我搜索我读到的最后一个单词并进行偏移的方式是不可能的,因为存在重复的可能性。
感谢您的帮助:)
【问题讨论】:
标签:
java
file
inputstream
bufferedreader
【解决方案1】:
答案将取决于文件系统语义和缓冲区的使用。 Java 运行在操作系统之上,该操作系统提供了一种称为“文件”的抽象,java 通过自己的 API(使用 FileInputStream 等)公开该抽象。
如果您使用的是BufferedReader,则该读取器有一个缓冲区,它存储从实际文件中读取的任何内容的内存副本(由底层操作系统报告)。因此,如果您在 Java 之外更改文件上的内容,则无法保证您的阅读器将返回最新的、新鲜的版本——而不是之前读入缓冲区的任何内容。
获取新鲜内容的安全方法是:
- 关闭文件
- 再次打开
- 寻找你想阅读的位置,阅读内容。
即便如此,您也不能完全保证获得真正新鲜的内容,因为它取决于操作系统处理写入的方式(这又可能取决于文件所在的设备:网络共享与旋转磁盘不同...)。在一个应用程序认为它已将内容写入磁盘(或更糟:将其写入尚未刷新到磁盘的内部缓冲区)与实际文件被完全写入之间可能存在延迟出来并准备好被其他人阅读。请注意对完全的强调:如果您在其他地方仍在编写文件时阅读它们,则可以获得文件的部分更新版本。
这是人们使用数据库的原因之一:它们保证您永远不会获得部分更新的版本(通过使用事务和原子更新)。有比文件更好的方法在同一台机器上通信两个应用程序;例如,考虑使用套接字。