本帖最后由 yujinlong0001 于 2012-02-22 22:48:18 编辑

解决方案 »

  1.   

    1、(BufferedReader)读文字的速度非常慢~~~~~10M左右的东西要30秒到1分钟,如何提高文字读取的速度
    ——敢问你是1个字符1个字符读取的,还是32K 32K读取的?
      

  2.   

    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));
      

  3.   

    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());
      

  4.   

    不好意思~~~我试了一下,用char[1024*32]去打开一个4.5M的txt文档,结果。。
    补充一下,我说的快慢,是对比wordpad,一些其他的读大文本的文本阅读工具,如小说阅读器Alreader
    我现在的打开文本的速度跟Windows的notepad基本持平~~~~但是我想要的是wordpad的打开速度
      

  5.   


    想要Word或者UtralEdit的速度,就不能做全读取。要想想看UtralEdit是可以编辑几个G大小的文件滴。如6楼所说,只能用RandomAccess来分块按需读取,并按块建立索引。
      

  6.   

    受教了~~~~用RandomAccess来分块按需读取,并按块建立索引倒是可以考虑~~~~为保证顺序,应该给每个块加编号(成Map了)或把块存入Vector不过接下来呐?JTextPane.setText()多少文字进来——JTextPane没有append方法!全部?和我用StringBuffer存读进来的文字有什么区别?
    部分?最少读2个块吧——不然2个块交接处的文字怎么查?怎么动态变更读取的块?
      

  7.   

    按需的话,就是部分。看策略,已经读取后的块可以缓存起来。修改的内容需要专门索引块保存。文件读取可以考虑用另一个线程异步方式载入。编辑界面,要自己写处理类继承JTextPane来处理,滚动条滚行操作要进行计算,然后选块显示。总体来说复杂度不低,如果不是非要编辑超大文件的话,确实没必要走上这条路。
    这里有另一个人的讨论贴可以看看:
    http://www.iteye.com/topic/712497
      

  8.   

    我要结贴了~~~但是你们的答案让我不满意啊~~~~~不好意思了~~~~文件快速读入的方法我找到了用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();
    }
    }
    }