【问题标题】:Java Efficient Ways to auto-save text filesJava 自动保存文本文件的有效方法
【发布时间】:2020-03-03 15:27:32
【问题描述】:

我正在尝试创建具有“自动保存”功能的文本编辑器。这意味着每当用户对当前文本进行任何更改(例如添加或删除字母、单词、行等)时,该更改也应立即应用于文本文件。

我使用 Javafx 中的“TextArea”控件来检测文本中的任何更改。此外,每当检测到更改时,我都会使用 BufferedWriter 从头开始​​将新文本写入文件。 然而,这对我来说似乎不正确,因为 BufferedWriter 将不得不从头开始重写所有文本。如果文本太大,这将导致性能问题。

有没有人对如何实现这个有更好的想法?提前致谢。

【问题讨论】:

  • 顺便说一句,您的文件写入器不需要缓冲区。缓冲写/读是为了低效在读中写。因此,例如,如果您是逐行或随着时间的推移而不是一次全部写入文件。

标签: java performance text-files bufferedwriter autosave


【解决方案1】:

诀窍是使用计时器,并且仅在文档已被修改时才写入更新。

给出的示例适用于 Swing 组件,但可以适应其他框架

boolean dirtyFlag = false; // set true if the document is altered
DocumentListener dl = new DocumentListener() { ... // implement all methods and set dirtyFlag = true in each
TimerTask task = new TimerTask() {
  public void run() {
    //save the file
  }
}
Timer t = new Timer();
t.scheduleAtFixeRate(task, ..., ...);

【讨论】:

    【解决方案2】:

    如果有人在文件开头附近插入或删除,那么无论如何都必须重写大部分文件。

    因此,您的策略必须是如何让自动保存看起来毫不费力。为此,您可能希望将输出写入线程上的备份文件,并且仅当安全写入该备份时,才将其移至先前的备份。显然,您只能在第一次备份完成后开始记录下一次备份,因此您无法以这种方式记录所有更改。

    另一种策略是编写更改日志,当用户选择恢复时可以重新应用这些更改。您可以每隔一段时间编写一个新的完整备份,然后重置日志。该日志可能与您用于撤消/重做的数据相同。

    【讨论】:

    • 好的,但是如果用户选择关闭文件而不是恢复它怎么办?或者如果电源关闭?
    • @user6115152 那么你的程序将不得不在用户下次启动时询问他们是想重播自上次完整备份以来的日志,还是从上次完整备份中恢复。你没用过excel吗?您可能将这些日志或备份文件存储在您的应用程序知道的某个位置,因此在启动时快速扫描会发现是否有任何需要恢复或删除的文件。
    猜你喜欢
    • 2011-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多