最近项目中碰到一个问题,需要在JEditorPane中显示比较大的文件,请问各位大大有什么方法可以解决性能问题啊。
是否可以用滚动条+内存映射文件处理,滚动条移动一定范围,就读取一部分数据?
目前使用的代码如下:(定制了词法显示)
private void read(javax.swing.JEditorPane editor) {
try {
     FileInputStream file = new FileInputStream(filename);
     // BufferedInputStream in = new BufferedInputStream(file);
    
     editor.read(file, new Object());
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

解决方案 »

  1.   

    -Xmx1024M 行不? 或再大点. 不过即使是读进来了,速度也慢得吓人吧
      

  2.   

    首先,肯定是要用滚动条了,大型文件,无论你的屏幕多大,现有技术条件下,一个屏幕,估计显示不下100M的文本文件内容。
    其次,采用内存映射文件的处理技术,目的是加快IO的访问速度,是用户页面更加流畅。
    所以,楼主提出的 滚动条+内存映射文件的方式,是可行的。技术方面没问题,关键是楼主怎样使用API来编程。如果想是用JEditorPane类,应该先了解它的用途和用法。
    首先声明,本人并没多少GUI方面的编程经验,所以,有胡说八道的成分,请大家海涵。
    我大致看了一下这个类的代码,貌似,这个类是显示诸如网页文本的,而且,打开一个页面的过程,是先将整个文件都读到内存,然后进行显示。
    这样的话,这个类,显然不符合大文件显示的要求了。如果,这个类还有这方面的功能扩展,或者它的继承类有扩展功能的话,我们还可以再考虑考虑。如果所操作的文本,没有超链接方面的处理过程,不妨使用JTextArea这个类,这个类的使用相对要简单一些。
    当然,无论是这个类,还是楼主用的那个类,在使用之前,都应该先了解一下MVC的相关知识,最起码,要意识到,读取并显示文件,这个功能代码要分成数据部分和显示部分,然后是将两者贯通的部分。这样,对于源码的学习是很有帮助的。当然,如果能有这个前提基础,使用这些类,那就是小菜一碟了。楼主不妨重点看一下Document类,从名字上就可以看出,应该是你程序的数据部分的代码类了。
    如果JDK类库中,没有楼主所要功能的Document实现类,楼主不妨自己设计一个实现类,最终完成大文件的显示功能。
      

  3.   

    我也觉得自己设计一个UI,把它包进JScrollPane里去好些
      

  4.   

    谢谢楼上各位的回复。
    采用JEditorPane主要是因为要对文本内容分格式显示(类似HTML、Java语言关键字高亮显示),JTextArea好像不能支持分格式显示。
    目前主要在研究jsyntaxpane(http://code.google.com/p/jsyntaxpane/)。请问通过哪些方法可以对滚动条进行控制?
      

  5.   

    内存映射有一个最大的问题。
    如果向文本中间插入或者删除一段数据后,对应的文件中插入或删除部分后面的数据都要移动,也即要不停的进行IO操作,而且是大量的,说不定打开这个文件半小时,就要向硬盘上写上几十G的数据都是很可能的。
      

  6.   

    jsyntaxpane使用的什么原理?
    如何实现语法加亮的啊?
    谢谢
      

  7.   

    分段读入的话,滚动条有点麻烦,肯定不能直接用JScrollPanel吧?它计算的应该是当前的光标在整个JEditorPane所编辑文本中的位置,但这个时候JEditorPane保存的文本肯定是不全的,那样滚动条的显示肯定有问题;
    是不是可以Extends JScrollPane?修改它计算bar长度以及位置的算法?还有10楼的问题,感觉需要一个临时文件来保存文本的当前状态。综上,感觉过程应该是,先预读一次,并把文本内容copy到一个临时文件,顺便计算文本总长度;Extends JScrollPane,修改它计算bar的相关算法;
    监听bar的roll事件,当文本显示到末尾时,重新读入数据;
    监听键盘事件,当添加/删除文本时append到临时文件中;另外,内存中可以保存当前页,前一页,后一页的文本,那样就不用在少量的添加/删除的时候都读写文件了上面是一点不成熟的想法,没实践过,抛砖引玉了,呵呵。
      

  8.   

    文件确实很大,直接用jScrollPane不行?
      

  9.   

    直接用JScrollPane,小文件可以直接打开,速度还可以。稍大一点,程序就直接卡住了。