Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Swing大文件性能_Java_Performance_Swing - Fatal编程技术网

Java Swing大文件性能

Java Swing大文件性能,java,performance,swing,Java,Performance,Swing,我们需要使用大约50mb的swing加载和显示大型文件(富文本)。问题是渲染文件的性能非常差。我们尝试了JTextPane和JEditorPane,但都没有成功 有没有人有这方面的经验,可以给我一些建议 谢谢,我在这方面没有任何经验,但如果您真的需要加载大文件,我建议您使用JTextPane/JEditorPane进行某种延迟加载 定义JTextPane/JEditorPane可以很好地处理的限制(如500KB或1MB)。您只需要将文件的一块加载到具有此大小的控件中 首先加载文件的第一个分区 然

我们需要使用大约50mb的swing加载和显示大型文件(富文本)。问题是渲染文件的性能非常差。我们尝试了JTextPane和JEditorPane,但都没有成功

有没有人有这方面的经验,可以给我一些建议


谢谢,

我在这方面没有任何经验,但如果您真的需要加载大文件,我建议您使用JTextPane/JEditorPane进行某种延迟加载

定义JTextPane/JEditorPane可以很好地处理的限制(如500KB或1MB)。您只需要将文件的一块加载到具有此大小的控件中

首先加载文件的第一个分区

然后,您需要与滚动容器交互,查看它是否已到达文件当前块的结尾/开头。如果是这样,则显示一个漂亮的等待光标,并将上一个/下一个块加载到内存和文本控件中

加载区块是根据文件中当前光标位置(偏移量)计算的

加载区块=偏移-限制/2到偏移+限制/2

加载块时,JTextPane/JEditorPane上的文本不得更改,否则用户会感觉文件处于另一个位置


这不是一个简单的解决方案,但如果您找不到任何其他第三方控件来执行此操作,我会这样做。

编写一个能够处理大型文档的高效所见即所得文本编辑器是一个相当困难的问题——当您进入大型书籍时,即使Word也会遇到问题

Swing是通用的,但您必须围绕它构建一个工具集,包括单独管理文档和分页文档


你可以看看OpenOffice,你可以将OO文档编辑器屏幕嵌入到你的应用程序中。我相信它被称为OOBean…

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

JTextPane/JEditorPane甚至不能处理1mb的文本(尤其是长行文本)

您可以尝试JEdit()——它比Swing文本组件快得多,但我怀疑它能否处理这么多的文本。我尝试使用45m文件,当它被加载(大约25秒)并且我可以向下滚动时,我开始使用1700m堆“outofmemory”

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

  • 使用分页。通过在页面中显示文本,可以很好地使用标准Swing

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


  • 对于非常大的文件,您可以构建一个索引文件,其中包含字符中每行的偏移量,因此获取“偏移量”是一个快速的“按行号查找”,而读取文本是一个带有此偏移量的“”。使用这种技术可以查看非常大的文件。

    我们也有同样的问题。是否找到了一个很好的解决方案?对于一些看起来很琐碎的事情,我不愿意这样做。在上面提到的第2点中,假设TextArea最多可以显示n条记录。每当用户向上或向下滚动时,我们都需要从文件中读取更多的行。您将如何确定下一个(或上一个)要读取的行数?