求助:自己写记事本过程中遇到的几个问题 本帖最后由 yujinlong0001 于 2012-02-22 22:48:18 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 1、(BufferedReader)读文字的速度非常慢~~~~~10M左右的东西要30秒到1分钟,如何提高文字读取的速度——敢问你是1个字符1个字符读取的,还是32K 32K读取的? br = new BufferedReader(new FileReader(file)); String line; // StringBuffer要报空指针错误,所以给它赋了初值,只是最后要把额外写的字符串去掉 StringBuffer buffer = new StringBuffer("Hello"); while ((line = br.readLine()) != null) { buffer.append(line).append("\n"); } txtEdit.setText(buffer.substring(5)); readLine() 每次读取量比较有限,建议考虑尝试这么玩:1、定义 byte[] buffer = new byte[64*1024];2、bis = new BufferedInputStream(new FileInputStream(file));3、baos = new ByteArrayOutputStream();4、循环读取bis.read(buffer);然后直接把buffer写入baos;5、new String(baos.toByteArray()); 不好意思~~~我试了一下,用char[1024*32]去打开一个4.5M的txt文档,结果。。补充一下,我说的快慢,是对比wordpad,一些其他的读大文本的文本阅读工具,如小说阅读器Alreader我现在的打开文本的速度跟Windows的notepad基本持平~~~~但是我想要的是wordpad的打开速度 想要Word或者UtralEdit的速度,就不能做全读取。要想想看UtralEdit是可以编辑几个G大小的文件滴。如6楼所说,只能用RandomAccess来分块按需读取,并按块建立索引。 受教了~~~~用RandomAccess来分块按需读取,并按块建立索引倒是可以考虑~~~~为保证顺序,应该给每个块加编号(成Map了)或把块存入Vector不过接下来呐?JTextPane.setText()多少文字进来——JTextPane没有append方法!全部?和我用StringBuffer存读进来的文字有什么区别?部分?最少读2个块吧——不然2个块交接处的文字怎么查?怎么动态变更读取的块? 按需的话,就是部分。看策略,已经读取后的块可以缓存起来。修改的内容需要专门索引块保存。文件读取可以考虑用另一个线程异步方式载入。编辑界面,要自己写处理类继承JTextPane来处理,滚动条滚行操作要进行计算,然后选块显示。总体来说复杂度不低,如果不是非要编辑超大文件的话,确实没必要走上这条路。这里有另一个人的讨论贴可以看看:http://www.iteye.com/topic/712497 我要结贴了~~~但是你们的答案让我不满意啊~~~~~不好意思了~~~~文件快速读入的方法我找到了用FileChannel,代码片段如下:private void readChannel(File file){ FileInputStream input=null; FileChannel fin=null; try{ input=new FileInputStream(file); fin=input.getChannel(); MappedByteBuffer mbb=fin.map(FileChannel.MapMode.READ_ONLY, 0, file.length()); byte[] data=new byte[(int)file.length()]; int foot=0; while(mbb.hasRemaining()){ data[foot++]=mbb.get(); } txtEdit.setText(new String(data)); }catch(Exception e){ e.printStackTrace(); }finally{ try { fin.close(); input.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } 请问这个需求的sql怎么写呀? 多谢! 排序问题 java swing 高手请进 IT新手,请各位代码狂人帮助。 [求助][有趣]从名字找到对象.... 关于多线程的一个小疑问 应该怎样把一个表中的BLOB字段倒入另一个表中?(不利用流的形式直接倒) 请教高手,如何在一个string 中加入硬回车 谁能给我一个java作图的例子啊!很急用啊!只要能做简单的图形就可以了!! 为何用break无法跳出while循环? Java ClassLoader机制引发的WinForm程序加载类的一些疑惑? 求解答 截屏没有鼠标
——敢问你是1个字符1个字符读取的,还是32K 32K读取的?
String line;
// StringBuffer要报空指针错误,所以给它赋了初值,只是最后要把额外写的字符串去掉
StringBuffer buffer = new StringBuffer("Hello");
while ((line = br.readLine()) != null) {
buffer.append(line).append("\n");
}
txtEdit.setText(buffer.substring(5));
1、定义 byte[] buffer = new byte[64*1024];
2、bis = new BufferedInputStream(new FileInputStream(file));
3、baos = new ByteArrayOutputStream();
4、循环读取bis.read(buffer);然后直接把buffer写入baos;
5、new String(baos.toByteArray());
补充一下,我说的快慢,是对比wordpad,一些其他的读大文本的文本阅读工具,如小说阅读器Alreader
我现在的打开文本的速度跟Windows的notepad基本持平~~~~但是我想要的是wordpad的打开速度
想要Word或者UtralEdit的速度,就不能做全读取。要想想看UtralEdit是可以编辑几个G大小的文件滴。如6楼所说,只能用RandomAccess来分块按需读取,并按块建立索引。
部分?最少读2个块吧——不然2个块交接处的文字怎么查?怎么动态变更读取的块?
这里有另一个人的讨论贴可以看看:
http://www.iteye.com/topic/712497
FileInputStream input=null;
FileChannel fin=null;
try{
input=new FileInputStream(file);
fin=input.getChannel();
MappedByteBuffer mbb=fin.map(FileChannel.MapMode.READ_ONLY, 0, file.length());
byte[] data=new byte[(int)file.length()];
int foot=0;
while(mbb.hasRemaining()){
data[foot++]=mbb.get();
}
txtEdit.setText(new String(data));
}catch(Exception e){
e.printStackTrace();
}finally{
try {
fin.close();
input.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}