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();
}
}
...全文
236 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
  • 打赏
  • 举报
回复
分页显示,每页显示数据的量规定一下,这样就不会有性能问题,翻页的时候再读取下一页的数据。
内容概要:本文探讨了CUDA并行计算优化技巧在通信行业核心网中的应用,聚焦于DPI流量识别与编解码加速实践。文章系统阐述了数据包级并行处理、GPUDirect RDMA、零拷贝内存、原子操作优化、warp级聚合等关键技术,并通过五元组哈希流量统计算法的GPU实现案例,展示了如何利用CUDA大幅提升处理效率。代码层面突出哈希函数的SIMT友好设计、无锁并发哈希表构建、内存访问优化与工程化权衡,实现了单batch处理时延从80微秒降至5微秒以内,吞吐达200Gbps以上,显著优于传统CPU方案。最后展望了算网融合、AI原生网络与绿色低碳三大发展趋势。; 适合人群:具备CUDA编程基础、熟悉网络协议栈与高性能数据面开发的通信领域研发人员,尤其是从事核心网、用户面功能(如UPF)、DPI系统优化的工程师;也适用于关注GPU加速在通信信号处理中应用的技术人员。; 使用场景及目标:①提升核心网用户面流量处理性能,实现高吞吐低时延的DPI与流统计;②优化LDPC/Polar译码、TLS批量协商等计算密集型任务;③降低单位比特处理功耗,满足运营商“双碳”目标下的能效要求;④探索AI与传统通信处理融合的统一算力架构。; 阅读建议:学习时应重点关注哈希设计避免warp divergence、原子操作的合理使用、内存预分配与批处理策略,并结合实际网络流量特性进行实验调优;建议在支持GPUDirect RDMA的硬件平台上复现案例,深入理解GPU与智能网卡协同工作的全链路优化潜力。
已经博主授权,源码转载自 https://pan.quark.cn/s/a4b39357ea24 在C语言编程环境中,指针是一项极为关键的基础元素,它赋予程序直接接触并干预内存位置的能力。本文将细致研究三种核心指针类型:指针数组、数组指针以及二级指针。 我们首先需要掌握指针的基础知识。所谓指针,即变量的内存位置标记,当我们声明一个指针变量,比如`int *p`,实际上是在构建一个能够容纳整型变量地址的标记。借助`&`运算符,我们可以获取变量的内存位置,并将其分配给指针,例如`p = &i`。不仅如此,指针还能用于数组元素的访问,例如`a[i]`与`*(a + i)`效果相同,因为数组名称在C语言中被视作指向数组首元素的指针。 数组指针属于一种特殊的指针变量,其指向的是某个一维数组的首地址。以一个整型数组`int a[5]`为例,`int (*p)[5]`即表示一个数组指针,它能保存数组`a`的地址。当对数组指针执行解引用操作`*p`时,结果将是整个数组,而非数组的第一个元素。由此可见,`*p`与`a`等价,它们都指向数组的起始点。 指针数组则是一种数组,其构成元素均为指针。例如,`int *p[5]`定义了一个由五个整型指针构成的数组。此类变量能够储存多个地址,每个地址都可以关联到一个整型变量。借助下标操作,例如`p[i]`,我们可以访问并处理这些指针所指向的变量。 二级指针,亦称为多级指针,是一种指向指针的指针。比如,`int **pp`即是一个二级指针,它能储存一个指向`int *`类型变量的地址。二级指针常用于处理多维数组,尤其是二维数组。在二维数组中,第一层索引通常对应行,第二层索引对应列。假设有一个`int arr[3][4]`的二维数组,一个二级指针`int ...

62,621

社区成员

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

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