比如说又一个868M的文本类型的文件  这个文件虽然很大,但是迫不得已必须要仔细查看,而且经常打开翻看,现在要用java写一个程序来读取。
有如下要求(越往上越优先,不一定全部符合要求,希望尽力而为):1.节省内存(或者说适合低配置的电脑,现在一个程序花100M内存我都觉得很大了)。
2.适合读大文件。
3.效率尽量高。

java读取文件的各种类我都试过 ,感觉效果都不太好,正在考虑要不要自己写一个类,无奈技术太差了。谁写得最好分数就给谁(我会保证80%的分归他的)。

解决方案 »

  1.   

    你可以看看 sf.net 上的 Rowscope项目 http://rowscope.sourceforge.net/Rowscope is a file viewer for large text files. It can read files larger than 1 GB.
    It is very fast (a few seconds to examine a 1GB file) and it never blocks.
      

  2.   

    如果只是查找字符串而且用java的话,再大只要能一次性读入内存,我觉得jdk提供的那些功能类已经很“底层”了吧
      

  3.   

    LZ你自己设定一次读取多少行不就行了?要看后面的内容就再调用一次读取,只要每次读取都是同一个IO对象就行了,不要关了再new就行了。
      

  4.   

    采用分割读取吧
    import java.io.File;
    import java.io.RandomAccessFile;
    import java.nio.*;
    import java.nio.channels.FileChannel;
    import java.util.*;
    import java.util.Map.Entry;public class LogTest 
    {
     public static String path = "E:\\test.log";
     public static void main(String[] args) throws Exception 
     {
        final int BUFFER_SIZE = 0x1200000;  //缓冲大小12M
        
        File f = new File(path);  
        
        int temp = 0;     
        
        for(int z = 10 ;z > 0 ; z --)
        {
        MappedByteBuffer inputbuffer = new RandomAccessFile(f,"r").getChannel().map(FileChannel.MapMode.READ_ONLY ,f.length()*(z-1)/10 ,f.length()/10 );
             
        for( int offset = 0 ; offset < inputbuffer.capacity() ; offset += BUFFER_SIZE )
        {
         byte[] bs = new byte[BUFFER_SIZE];
         if(inputbuffer.capacity() - offset >= BUFFER_SIZE)
         {
         for(int i = 0; i < BUFFER_SIZE; i ++)
         {
         bs[i] = inputbuffer.get(offset +  i);
        }
         }
         else
         {
         for( int i = 0; i < inputbuffer.capacity() - offset ; i ++)
         {
         bs[i] = inputbuffer.get(offset + i);
         }
         }
          int length = (inputbuffer.capacity() % BUFFER_SIZE == 0) ? BUFFER_SIZE
              : inputbuffer.capacity() % BUFFER_SIZE;
          
          temp +=new String(bs,0,length).length();
              
         }
        
        }  
       
        
     }    
    }
      

  5.   

    来把帖子顶上去  话说我在用MappedByteBuffer  但是业务有点复杂还在考虑中
      

  6.   

    罢了 还是结贴吧  都没人回答 现在虽然能打开时候慢慢加载数据  终究不能都放到内存中  看来还是放一部分好了   用个按钮来让户自己加载数据  Rowscope也是这样做的