java - 如何通过偏移读取更改的文本文件
问题描述
例如,有一个文本文件。
文本文件更改。
test.txt = abcde
1分钟后
test.txt = cdefg
(a,b be deleted / f,g add)
在这种情况下,我将所有过去的文件读到e
.
所以我想读取f
当前文件的。(这是一个例子,没有人知道会出现什么词。)
我搜索我读到的最后一个单词并进行偏移的方式是不可能的,因为存在重复的可能性。
我会很感激你的帮助:)
解决方案
答案将取决于文件系统语义和缓冲区的使用。Java 运行在操作系统之上,该操作系统提供了一个称为“文件”的抽象,java 通过其自己的 API(withFileInputStream
等)公开该抽象。
如果您使用的是BufferedReader
,则该阅读器有一个缓冲区,它存储从实际文件中读取的任何内容的内存副本(由底层操作系统报告)。因此,如果您在 Java 之外更改文件上的内容,则无法保证您的阅读器将返回最新的、新鲜的版本——而不是前一阵子读入缓冲区的任何内容。
获取新鲜内容的安全方法是:
- 关闭文件
- 再次打开它
- 寻找你想阅读的位置,阅读内容。
即使那样,您也不能完全保证获得真正新鲜的内容,因为它取决于操作系统处理写入的方式(这又可能取决于文件所在的设备:网络共享与旋转磁盘不同...... )。在一个应用程序认为它已将内容写入磁盘(或更糟:将其写入尚未刷新到磁盘的内部缓冲区)与实际文件被完全写出并准备好读取之间可能存在延迟其他。请注意完全强调:如果您在文件仍在其他地方写入时阅读它们,则可以获得部分更新的文件版本。
这是人们使用数据库的原因之一:它们保证您永远不会获得部分更新的版本(通过使用事务和原子更新)。有比文件更好的方法在同一台机器上通信两个应用程序;例如,考虑使用套接字。
推荐阅读
- javascript - 如何实现 startActivityForResult - 反应原生
- kubernetes - 更新主节点上的映像后 kubernetes 集群关闭
- c# - 在 EF Core 2.1 中的 DbContext 上执行 RAW SQL
- angular - 使用 ngFor 的角度路由
- android - 协程取消注册接收者取消
- ios - 如何使用swift在IOS中的另一个ImageVIew之上显示一个Imageview
- python - 如何在熊猫中绘制密度图和折线图
- jenkins - 通过 Jenkins 运行时测试用例失败
- python - Django:下载功能的 MultiValueDictKeyError 问题
- python - 更改python中列表列表的代码