JEditorPane如何显示大文件(>100mb)

TTYangF 2010-01-28 05:28:06
最近项目中碰到一个问题,需要在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();
}
}
...全文
237 19 打赏 收藏 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
liuyun9902 2010-02-07
  • 打赏
  • 举报
回复
读取文件后界面很卡
liuyun9902 2010-02-07
  • 打赏
  • 举报
回复
关注中,遇到同样的问题
重返春季 2010-01-30
  • 打赏
  • 举报
回复
可以利用线程解决,把文件分成多个小文件,慢慢读取。
TTYangF 2010-01-29
  • 打赏
  • 举报
回复
谢谢楼上各位的回复。
采用JEditorPane主要是因为要对文本内容分格式显示(类似HTML、Java语言关键字高亮显示),JTextArea好像不能支持分格式显示。
目前主要在研究jsyntaxpane(http://code.google.com/p/jsyntaxpane/)。

请问通过哪些方法可以对滚动条进行控制?
ouyangyh 2010-01-29
  • 打赏
  • 举报
回复
我也觉得自己设计一个UI,把它包进JScrollPane里去好些
TTYangF 2010-01-29
  • 打赏
  • 举报
回复
直接用JScrollPane,小文件可以直接打开,速度还可以。稍大一点,程序就直接卡住了。
py330316117 2010-01-29
  • 打赏
  • 举报
回复
文件确实很大,直接用jScrollPane不行?
@井九 2010-01-29
  • 打赏
  • 举报
回复
100M...好大的文件
focusforce 2010-01-29
  • 打赏
  • 举报
回复
用分页实现的可能性比滚动条实现大,滚动条一次滚动多少行,每行多少字,很难把控。
windgh 2010-01-29
  • 打赏
  • 举报
回复
分段读入的话,滚动条有点麻烦,肯定不能直接用JScrollPanel吧?它计算的应该是当前的光标在整个JEditorPane所编辑文本中的位置,但这个时候JEditorPane保存的文本肯定是不全的,那样滚动条的显示肯定有问题;
是不是可以Extends JScrollPane?修改它计算bar长度以及位置的算法?

还有10楼的问题,感觉需要一个临时文件来保存文本的当前状态。

综上,感觉过程应该是,先预读一次,并把文本内容copy到一个临时文件,顺便计算文本总长度;Extends JScrollPane,修改它计算bar的相关算法;
监听bar的roll事件,当文本显示到末尾时,重新读入数据;
监听键盘事件,当添加/删除文本时append到临时文件中;

另外,内存中可以保存当前页,前一页,后一页的文本,那样就不用在少量的添加/删除的时候都读写文件了

上面是一点不成熟的想法,没实践过,抛砖引玉了,呵呵。
meadking 2010-01-29
  • 打赏
  • 举报
回复
jsyntaxpane使用的什么原理?
如何实现语法加亮的啊?
谢谢
Inhibitory 2010-01-29
  • 打赏
  • 举报
回复
内存映射有一个最大的问题。
如果向文本中间插入或者删除一段数据后,对应的文件中插入或删除部分后面的数据都要移动,也即要不停的进行IO操作,而且是大量的,说不定打开这个文件半小时,就要向硬盘上写上几十G的数据都是很可能的。
冰思雨 2010-01-29
  • 打赏
  • 举报
回复
首先,肯定是要用滚动条了,大型文件,无论你的屏幕多大,现有技术条件下,一个屏幕,估计显示不下100M的文本文件内容。
其次,采用内存映射文件的处理技术,目的是加快IO的访问速度,是用户页面更加流畅。
所以,楼主提出的 滚动条+内存映射文件的方式,是可行的。

技术方面没问题,关键是楼主怎样使用API来编程。

如果想是用JEditorPane类,应该先了解它的用途和用法。
首先声明,本人并没多少GUI方面的编程经验,所以,有胡说八道的成分,请大家海涵。
我大致看了一下这个类的代码,貌似,这个类是显示诸如网页文本的,而且,打开一个页面的过程,是先将整个文件都读到内存,然后进行显示。
这样的话,这个类,显然不符合大文件显示的要求了。如果,这个类还有这方面的功能扩展,或者它的继承类有扩展功能的话,我们还可以再考虑考虑。

如果所操作的文本,没有超链接方面的处理过程,不妨使用JTextArea这个类,这个类的使用相对要简单一些。
当然,无论是这个类,还是楼主用的那个类,在使用之前,都应该先了解一下MVC的相关知识,最起码,要意识到,读取并显示文件,这个功能代码要分成数据部分和显示部分,然后是将两者贯通的部分。这样,对于源码的学习是很有帮助的。当然,如果能有这个前提基础,使用这些类,那就是小菜一碟了。

楼主不妨重点看一下Document类,从名字上就可以看出,应该是你程序的数据部分的代码类了。
如果JDK类库中,没有楼主所要功能的Document实现类,楼主不妨自己设计一个实现类,最终完成大文件的显示功能。
pauliuyou 2010-01-28
  • 打赏
  • 举报
回复
-Xmx1024M 行不? 或再大点. 不过即使是读进来了,速度也慢得吓人吧
wenjjing2lianee 2010-01-28
  • 打赏
  • 举报
回复
是否可以用滚动条+内存映射文件处理,滚动条移动一定范围,就读取一部分数据

应该可以的,不知道有没有滚动条的这个事件,根据滚条的距离顶端位置或其它条件.

文件一定是一个吗?文件能不能考虑分成小文件.

还可以用一个线程去读取,隔相应的时间去加载一次.
一头头 2010-01-28
  • 打赏
  • 举报
回复
jf 只要4分 thanks!
铁匠梁老师 2010-01-28
  • 打赏
  • 举报
回复
学习UE的加载方式,未深入了解过
TTYangF 2010-01-28
  • 打赏
  • 举报
回复
是在桌面程序中使用,读取本地文件,不是网页,这样是否也可以用分页显示?
如果通过滚动条控制(上下移动),要保持滚动平滑,分页的长度是不是要比实际显示的要大些?
左大神在这 2010-01-28
  • 打赏
  • 举报
回复
分页显示,每页显示数据的量规定一下,这样就不会有性能问题,翻页的时候再读取下一页的数据。
内容概要:本文围绕通过短时倒谱(Cepstrogram)计算进行时-倒频分析的研究,提出了一种基于Matlab的信号处理方法,旨在从复杂信号中提取时变的倒频域特征,尤其适用于具有非线性反馈的LTI系统识别。文中系统阐述了短时倒谱的理论基础、计算流程与实现机制,并结合Simulink与Matlab代码实现了多个典型应用案例,涵盖非线性系统辨识、路径损耗建模、信号去噪与增强等,充分展示了该方法在系统建模与信号分析中的强大能力。研究不仅提供了完整的算法实现方案,还深入探讨了其在科研与工程实践中的广泛应用前景。; 适合人群:具备扎实的信号处理理论基础与Matlab编程能力,从事自动化、通信工程、电子工程、控制科学等领域的高校研究生、科研人员及工程技术人员。; 使用场景及目标:①实现对具有非线性反馈的LTI系统的精确建模与参数辨识,提升系统识别的准确性与鲁棒性;②在强噪声背景下进行有效的信号特征提取与时-倒频域分析,恢复信号的有效成分;③作为高级信号处理的教学与科研平台,帮助深入理解倒谱分析的物理意义及其在现代工程中的实际应用。; 阅读建议:建议读者在学习过程中紧密结合文中提供的Matlab代码与Simulink模型进行动手实践,通过调整参数、修改输入信号等方式观察分析结果的变化,以加深对算法机理的理解;同时可访问作者提供的网盘资源与完整代码包,系统性地掌握相关技术的优化与拓展方法。

62,620

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧