要读取一个近500M的文件,请问大家有何高招,
我用BufferedInputStream还是出现了OutOfMemoryError的错误。
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space我按照这个文章中说的方法也是无法读取500m的large文件,
http://techrepublic.com.com/5208-10878-0.html?forumID=10&threadID=108599&messageID=650720
public byte[] read2list(String file) throws Exception {
      InputStream in = null;
      byte[] buf             = null; // output buffer 
      int    bufLen          = 20000*1024;
      try{
         in = new BufferedInputStream(new FileInputStream(file));
         buf = new byte[bufLen];
         byte[] tmp = null;
         int len    = 0;
         List data  = new ArrayList(24); // keeps peaces of data
         while((len = in.read(buf,0,bufLen)) != -1){
            tmp = new byte[len];
            System.arraycopy(buf,0,tmp,0,len); // still need to do copy 
            data.add(tmp);
         }
         /*
            This part os optional. This method could return a List data
            for further processing, etc.
         */
         len = 0;
         if (data.size() == 1) return (byte[]) data.get(0);
         for (int i=0;i<data.size();i++) len += ((byte[]) data.get(i)).length;
         buf = new byte[len]; // final output buffer 
         len = 0;
         for (int i=0;i<data.size();i++){ // fill with data 
            tmp = (byte[]) data.get(i);
            System.arraycopy(tmp,0,buf,len,tmp.length);
            len += tmp.length;
         } 
      }finally{
         if (in != null) try{ in.close();}catch (Exception e){}
      }
      return buf;  
   }

解决方案 »

  1.   

    如果内存够大,调大java的heap的容量
    设置一下stack   size的大小   java   后跟参数即可设置,具体参数如下: 
    -Xms     size                   set   initial   Java   heap   size   
    -Xmx   size                 set   maximum   Java   heap   size   
    -Xss   size                   set   java   thread   stack   size 
      

  2.   

    同意1楼,同时可以用Runtime类的一些方法查看内存使用状况
    测了下,发现我装的Eclipse,默认只有64M。用楼主的这个类,读取60M的文件,居然消耗180M...class Test {
       public static void main(String[] args) {
          System.out.println("JVM MAX MEMORY:"+Runtime.getRuntime().maxMemory()/1024/1024+"M");
          System.out.println("JVM USED MEMORY:"+Runtime.getRuntime().totalMemory()/1024/1024+"M");
       }
    }