Swing大文件性能

9
我们需要使用swing加载和显示大文件(富文本),大约50mb。问题是渲染文件的性能非常差。我们尝试过JTextPane和JEditorPane,但都没有成功。有没有人有此方面的经验并能给我一些建议?谢谢!
4个回答

6
我没有相关经验,但如果你确实需要加载大文件,我建议你使用JTextPane/JEditorPane进行一种懒加载。定义一个JTextPane/JEditorPane可以很好处理的限制(如500KB或1MB),你只需要将该大小的文件块加载到控件中即可。从加载文件的第一个分区开始,然后与滚动容器交互,并查看它是否已到达当前文件块的末尾/开头。如果是,则显示一个漂亮的等待光标,将前一个/下一个块加载到内存中并加载到文本控件中。加载块是根据文件中当前光标位置(偏移量)计算的。加载块=偏移量-限制/2到偏移量+限制/2。JTextPane/JEditorPane上的文本在加载块时不能更改,否则用户会感觉自己处于文件的另一个位置。这不是一个简单的解决方案,但如果你找不到其他第三方控件来完成此操作,我会选择这种方式。

我们有相同的问题。对此是否找到了好的解决方案?对于看起来如此微不足道的事情,我很讨厌这样做。 - Andez

2
您可以使用内存映射文件I/O来创建一个“窗口”进入文件,并让操作系统处理文件的读取。

0
编写一个能够处理大型文档的高效WYSIWYG文本编辑器是一个相当困难的问题--即使Word在处理大型书籍时也会遇到问题。
Swing是通用的,但您必须建立一个工具集来管理文档并将它们分页。
您可以查看Open Office,您可以将OO文档编辑器屏幕嵌入到您的应用程序中。我相信这被称为OOBean...

0

JTextPane/JEditorPane 在处理甚至是 1MB 的文本时表现不佳(特别是长行的文本)。

你可以尝试使用 JEdit (StandaloneTextArea) - 它比 Swing 文本组件快得多,但我怀疑它是否能够处理这么多文本。我用 45m 文件尝试过,虽然加载了 (~25秒),我可以向下滚动,但随后我开始出现“outofmemory”错误,堆大小为1700m。

为了构建一个真正可扩展的解决方案,有两个明显的选择:

  1. 使用分页。你可以通过在页面中显示文本来很好地使用标准的 Swing。

  2. 构建自定义文本渲染器。它可以像可滚动窗格一样简单,只绘制可见部分,使用 BufferedReader 跳过文件中的所需行并读取有限数量的行来显示。我以前做过这件事,这是一个可行的解决方案。当然,如果需要具备“文本选择”功能,则需要进行更多的工作。

对于非常大的文件,您可以构建一个索引文件,其中包含每行字符的偏移量,因此获取“偏移量”是通过行号进行快速“随机访问”查找,并且使用此偏移量进行“跳过”读取文本。使用这种技术可以查看非常大的文件。

在上面提到的第二点中,假设TextArea最多可以显示n条记录。每当用户向上或向下滚动时,我们需要从文件中读取更多行。您将如何确定要读取哪些下一行(或上一行)? - user3004790

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接