见代码:FileReader fr=new FileReader(path);
            char[] c=new char[10240];
            String fileString="";
            int length=0;
            while((length=fr.read(c))!=-1)
            {
                fileString+=new String(c,0,length);
            }报,Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
目标文件是23MB的文本文件
如果我换成一个2MB的文本文件就正常
我想是不是 String的大小是不是有一定的限制,我换成StringBuffer也报一样的错误

解决方案 »

  1.   

    1、把JVM的内存设大点
    2、你把23M的文件读到内存做啥?不能切成小文件处理吗?
    3、等楼下说明
      

  2.   

    23M的文件读到内存中做啥?
      23M的文件是我从网站抓取的数据,然后用正则表达式进行分析把有用的数据提取出来
    我加了JVM的内存,但还是不行
      

  3.   

    FileReader fr=new FileReader(path);
      char[] c=new char[10240];
      String fileString="";
      int length=0;
      while((length=fr.read(c,0,c.length))!=-1)
      {
      fileString+=new String(c,0,length);
      }
    你改成上面那样的试试看,给读的时候也设置个缓存,
    我在写快速复制文件的小软件时也遇到过这样的错误,楼上说的也有道理,但我没改JVM,
    我最大把c设置成1048576,后面再大的数就会报这个错了
    Exception in thread "main" java.lang.OutOfMemoryError: Java heap space。
      

  4.   

    FileReader fr = new FileReader(path);
      char[] c = new char[10240];
      String fileString = "";
      int length = 0;
      while((length = fr.read(c,0,c.length)) != -1)         / 这里也设置个缓存c
      {
      fileString += new String(c,0,length);
      }
      

  5.   

    对了!忘记说要加包装流了!不然read方法用不了!不好意思,呵呵!
      

  6.   

    char[] c=new char[10240];改成了char[] c=new char[1048576];
    while((length=fr.read(c))!=-1)改成了while((length = fr.read(c,0,c.length)) != -1)
    JVM的内存加到了256m,终于读出这个23M的文本文件如果我要读到一个230M的文本文件,我要把内存加到多少呀
    有点晕
      

  7.   

    呵呵!你那样是在凑吧,没叫你设置成那么大,是说我最大可以设置成那么大。
    你的思路一直停留在原来的代码上,不做修改永远解决不了问题的。
    没必要一次性的把所有字节全部读都到一个数组中,API是你最好的助手。
      

  8.   

    可能是JAVA的堆栈设置太小的原因,
    还有用String效率太低,建议用StringBuilder;
    办法:
    1、设置环境变量:
    set JAVA_OPTS= -Xms32m -Xmx512m
    可以根据自己机器的内存进行更改,但本人测试这种方法并没有解决问题。可能是还有哪里需要设置。2、java -Xms32m -Xmx800m className:
    就是在执行JAVA类文件时加上这个参数,其中className是需要执行的确类名。(包括包名)
    这个解决问题了。而且执行的速度比没有设置的时候快很多。如果在测试的时候可能会用Eclispe 这时候就需要在Eclipse ->run -arguments 中的VM arguments 中输入-Xms32m -Xmx800m这个参数就可以了。不知是否正确,建议试一下。