最近项目中碰到一个问题,需要在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();
}
}
是否可以用滚动条+内存映射文件处理,滚动条移动一定范围,就读取一部分数据?
目前使用的代码如下:(定制了词法显示)
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();
}
}
其次,采用内存映射文件的处理技术,目的是加快IO的访问速度,是用户页面更加流畅。
所以,楼主提出的 滚动条+内存映射文件的方式,是可行的。技术方面没问题,关键是楼主怎样使用API来编程。如果想是用JEditorPane类,应该先了解它的用途和用法。
首先声明,本人并没多少GUI方面的编程经验,所以,有胡说八道的成分,请大家海涵。
我大致看了一下这个类的代码,貌似,这个类是显示诸如网页文本的,而且,打开一个页面的过程,是先将整个文件都读到内存,然后进行显示。
这样的话,这个类,显然不符合大文件显示的要求了。如果,这个类还有这方面的功能扩展,或者它的继承类有扩展功能的话,我们还可以再考虑考虑。如果所操作的文本,没有超链接方面的处理过程,不妨使用JTextArea这个类,这个类的使用相对要简单一些。
当然,无论是这个类,还是楼主用的那个类,在使用之前,都应该先了解一下MVC的相关知识,最起码,要意识到,读取并显示文件,这个功能代码要分成数据部分和显示部分,然后是将两者贯通的部分。这样,对于源码的学习是很有帮助的。当然,如果能有这个前提基础,使用这些类,那就是小菜一碟了。楼主不妨重点看一下Document类,从名字上就可以看出,应该是你程序的数据部分的代码类了。
如果JDK类库中,没有楼主所要功能的Document实现类,楼主不妨自己设计一个实现类,最终完成大文件的显示功能。
采用JEditorPane主要是因为要对文本内容分格式显示(类似HTML、Java语言关键字高亮显示),JTextArea好像不能支持分格式显示。
目前主要在研究jsyntaxpane(http://code.google.com/p/jsyntaxpane/)。请问通过哪些方法可以对滚动条进行控制?
如果向文本中间插入或者删除一段数据后,对应的文件中插入或删除部分后面的数据都要移动,也即要不停的进行IO操作,而且是大量的,说不定打开这个文件半小时,就要向硬盘上写上几十G的数据都是很可能的。
如何实现语法加亮的啊?
谢谢
是不是可以Extends JScrollPane?修改它计算bar长度以及位置的算法?还有10楼的问题,感觉需要一个临时文件来保存文本的当前状态。综上,感觉过程应该是,先预读一次,并把文本内容copy到一个临时文件,顺便计算文本总长度;Extends JScrollPane,修改它计算bar的相关算法;
监听bar的roll事件,当文本显示到末尾时,重新读入数据;
监听键盘事件,当添加/删除文本时append到临时文件中;另外,内存中可以保存当前页,前一页,后一页的文本,那样就不用在少量的添加/删除的时候都读写文件了上面是一点不成熟的想法,没实践过,抛砖引玉了,呵呵。