一些技巧可以使编辑更简单、更快捷。
- 索引它以加快访问速度。 当用户什么都不做时,浏览文件并创建一个索引,以便您可以快速找到文件中的特定位置(见下文)。
- 仅存储用户所做的更改。 在用户保存之前,不要尝试将它们直接应用于文件。
- 设置用户跳转到某个点时读取内存的限制。最初读取一两个屏幕的数据以便显示它,然后如果用户没有立即跳转到新位置,则在当前位置之前和之后读取一点。
索引:
当用户想要跳转到第 X 行或时间戳 T时,您不想浏览整个文件,计算换行符和字符。浏览数据并创建记录。比如说,每 50 行,记录字节偏移量、字符数和行号。这些数据可以存储在哈希表、树或只是一个有序列表中。然后当用户在文件中跳转时,您可以找到最近的索引点并从那里读取,直到找到请求的点。这种技术在使用 Unicode 时特别有用,其中每个字符的字节数可能会有所不同。如果文件太大,内存中无法容纳完整的索引,您可能希望限制索引点并将它们间隔得更宽,或者将索引存储在临时文件中。
编辑和更改大文件:
正如 Harvey 所建议的那样 - 仅将更改存储在内存中(作为差异),然后在通过从输入到输出的流式传输保存时将它们应用于文件。树或有序列表可能会有所帮助,因此您可以在从输入写入输出时快速找到下一个需要进行更改的地方。
如果更改太大而无法放入内存,您可能希望在单独的临时文件中跟踪它们(可能与原始文件位于同一文件夹中)。您可以继续编写一个连续的更改列表,并将新的更改附加到此更改文件中。保存时,您将通读更改列表并创建要应用的更改的最终列表,然后再删除临时文件。出于性能原因,避免重写更改日志文件可能会有所帮助;相反,只需附加到它的末尾,并在执行保存时删除多余的或取消的编辑。
有趣的事实:您用于更改日志的相同结构可用于提供撤消/重做信息。