我们需要使用swing来加载和显示大文件(富文本),大约50mb。问题是呈现文件的性能非常差。我们尝试了JTextPane和JEditorPane都没有运气。
有人有这方面的经验,可以给我一些建议吗?
感谢,
答案 0 :(得分:6)
我没有任何经验,但如果你真的需要加载大文件,我建议你用JTextPane / JEditorPane做一些延迟加载。
定义JTextPane / JEditorPane可以很好地处理的限制(例如500KB或1MB)。您只需要将一大块文件加载到具有此大小的控件中。
首先加载文件的第一个分区。
然后,您需要与滚动容器进行交互,并查看它是否已到达文件当前块的结尾/开头。如果是这样,显示一个漂亮的等待光标并将上一个/下一个块加载到内存并加载到文本控件中。
加载块是根据文件中当前光标位置(偏移量)计算的。
将chunk = offset - limit / 2加载到offset + limit / 2
加载块时,JTextPane / JEditorPane上的文本不得更改,否则用户会感觉自己处于文件的另一个位置。
这不是一个简单的解决方案,但如果你没有找到任何其他第三方控制来做到这一点,我会这样做。
答案 1 :(得分:2)
您可以使用内存映射文件I / O在文件中创建一个“窗口”,让操作系统处理文件的读取。
答案 2 :(得分:0)
编写一个可以处理大型文档的高效WYSIWYG文本编辑器是一个非常难的问题 - 当你进入大型书籍时,即使Word也会出现问题。
Swing是通用的,但你必须围绕它构建一个工具集,包括单独管理文档和分页。
您可以查看Open Office,您可以将OO文档编辑器屏幕直接嵌入到您的应用中。我相信它被称为OOBean ......
答案 3 :(得分:0)
JTextPane / JEditorPane甚至不能很好地处理1mb的文本(特别是带有长行的文本)。
你可以尝试使用JEdit(StandaloneTextArea) - 它比Swing文本组件快得多,但我怀疑它会处理这么多文本。我尝试使用45m文件,当它被加载(约25秒)并且我可以向下滚动时,我开始用1700m堆获得“outofmemory”。
为了构建真正可扩展的解决方案,实际上有两个明显的选择:
使用分页。通过在页面中显示文本,您可以使用标准Swing做得很好。
构建自定义文本渲染器。它可以像可滚动窗格一样简单,其中仅使用BufferedReader绘制可见部分以跳到文件中的所需行并读取有限数量的行以显示。我之前做过,这是一个可行的解决方案。如果你需要“文本选择”功能,当然这是一项更多的工作。
对于非常大的文件,您可以构建一个索引文件,其中包含每行字符的偏移量,因此获取“偏移量”是按行号快速“RandomAccess”查找,并且阅读文本是“ skip“有这个偏移量。使用这种技术可以查看非常大的文件。