最近项目中遇到了用JEditorPane显示大文件(100M以上)的问题,我有两个解决方案:
   1、用线程分段读取,分段插入,但这个方法要试用Document的insertString()方法,当读到后面时,内存会溢出。
   2、用滚动条来控制分页显示文件内容,这种效果最好,但由于用的内存映射,会把一行的内容分到两页去显示。数据完整性得不到保障。
 请问各位大大有什么解决方案,或有这方面的经验提出来分享一下,谢谢了~~!

解决方案 »

  1.   

    分段读
    或者用内存映射----刚从c++转过来,不知道Java里有没这个
      

  2.   

    java里面都有,但会出现问题,我帖子里发了。
      

  3.   

    直接读直接显示吧。
    你开启一个线程读取文本,此刻可以在窗口弹出一个waitDialog,等到读取文本结束。关闭waitDialog。显示。
    以前做过,稍微长时间的操作都是这么进行的。
    通过nio读取大本文。效果应该比较好些。
      

  4.   

    用NIO直接读这个没问题,问题在用JEditorPane的显示上面,100M的文件直接显示,就算内存不溢出,估计等显示出来至少5min,客户肯定有意见的
      

  5.   

    有没有哪位朋友研究过JEdit的文件加载方式啊。。想请教JEdit对大文件的读取方式
      

  6.   


    需要对整修文件操作,那就要加大内存防止溢出了吧。如果操作的不是内容或者不是需要全部内容,可以把大的内容做成hashmap保存到另一个文件。减小内存占用
      

  7.   

    楼上说的有道理``但-Xmx 治标不治本。这个项目大致是先把大文件文件类容显示给用户,供用户修改,编辑(包括词法解析,加亮等),然后根据文件里的关键字和文件数据内容,绘制图形(场数据),目前在解决第一显示数据部分。怎么能快速加载大文件,并保证文件数据的完整(我目前用的是内存映射加滚动条控制)。
    开发过大文件编辑器的大大也来给点建议啊。
      

  8.   


    我以为像复杂xml那样结构复杂,看来结构不太复杂,就是内容大。就用分页做吧,修改的只是显示的部分,内存映射也会溢出吗?注意垃圾回收。多加几个大括号让不用的数据过期。
    滚动条控制是什么意思?全部加载到内存吗?应该只给用户显示一页的视图吧。
      

  9.   

    我是用滚动条控制翻页,这个意思,滚动条到哪个位置,就读取那部分的数据。给客户的感觉是一次性把数据读进来了,但其实在内存中的数据只是很少。这也算是分页,但主要是这个分页是按字节分的,数据不连贯,但要是按行分,readLine()读取的性能又好差,不知道这个在分页上应该做什么相应的处理。
      

  10.   

    打开大的文本文件一直是个难题,就是window上的记事本打开一个大文件表现也不算太好,
    更何况楼主还要编辑文本的格式,关注一下。
      

  11.   

    我是用滚动条控制翻页,这个意思,滚动条到哪个位置,就读取那部分的数据。给客户的感觉是一次性把数据读进来了,但其实在内存中的数据只是很少。这也算是分页,但主要是这个分页是按字节分的,数据不连贯,但要是按行分,readLine()读取的性能又好差,不知道这个在分页上应该做什么相应的处理。
    这种设计是正确的,现在就是考虑读出来按行分,格式不变的问题啦
      

  12.   

    用BufferedReader,有个读取部分字节的方法read(char[] cbuf, int off, int len) 
    ,如果你一屏显示的数据是可计算的,那就用这个方法把部分数据先读到char[]中,然后构造出字符串显示。JEditorPane上用滚动条或者分页来设定off和len的值
      

  13.   

    是按字符分吧,换字节分就把字符分坏了吧。用的是等宽字体吗,如果是的话,计算出一行显示的字符。然后把文件换行分成小块,再用滚动条控制显示哪些行。用BufferedReader,有个读取部分字节的方法read(char[] cbuf, int off, int len)  
    ,如果你一屏显示的数据是可计算的,那就用这个方法把部分数据先读到char[]中,然后构造出字符串显示。JEditorPane上用滚动条或者分页来设定off和len的值
      

  14.   

    这个类是在处理Swing里的多线程才用到的类吧,这个地方也能用吗?我得查查API
      

  15.   

    来看看怎么搞笑的,全国地图那么大JAVA也能处理显示给使用浏览。100M这点文件也叫大文件?
      

  16.   

    这位大牛是做GIS的吧``我是才开始搞Swing的`对处理这些非 常规问题还是菜鸟,忘指点~~
      

  17.   

    也许可以用MappedByteBuffer,磁盘文件就像内存一样的使用,用JScrollPane,滚动到哪里就把position指向哪里,然后读取,显示。这样做速度和内存空间都不是问题了。MappedByteBuffer 就像一个窗口一样在文件上面移动,你要看哪些内容就读哪些就好了。