我的代码片段如下:
PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter(fileName)));
    //PrintWriter out = new PrintWriter(fileName);
    //FileOutputStream out = new FileOutputStream(fileName);     while (rs.next()) {
      for (int j = 1; j <= totalColumn; j++) {
        out.write(rs.getObject(j).toString());
        out.write("\t");
      }
       out.write("\n");
       out.flush();          }
}
我在代码中 写了 out.flush()用来刷新该流的缓冲; 可是当我的记录数超过3W时就报了内存益处的问题了,难道JAVA不能边读边写吗?还是out这个对象随着指向的fileName文件的边大占用内存也大了吗??到底怎么来实现用JAVA写更多的数据而不内存益处呢?请高手指点:)

解决方案 »

  1.   

    我也遇到过同样的问题
    用java操作电子表格,用的是jxl的包,有时候不稳定,操作的时候出现内存益处。
      

  2.   

    EXCEL我已经做过了是应为除了问题才用TXT的,请高手来指点啊!!!!!!!!!
      

  3.   

    应该是别的地方的问题吧。我用java写过上G的文件,都没事
      

  4.   

    用java -Xmx 选项设置在虚拟机中可以用的内存暂时这样吧,建议仔细审一下相关业务流程,或者看看有没有更好的办法来写文件!
      

  5.   

    用java -Xmx 增加虚拟机这个可以解决,但是我现在数据两小当存千万数据时服务器内存都不够再加时怎么办呢?一定要从根本上解决问题啊,有没有哪位高手能站出来指点小弟一下啊?万分感谢!!!!!!!!!
      

  6.   

    个人怀疑:不是超过3w才出问题,而是大约3w左右的那几行数据有问题。可能一次性写入太大了。你可以指定一下只读取3w左右出问题附近的那几条数据,试试,看看是不是即使只有那么几条数据也出问题。
      

  7.   

    把 out.flush() 放到for里面如何
      

  8.   

    to yun15291li(秋飞意) :
      我一开始也这么怀疑数据有问题,但是改写为如下:
    for (int j = 1; j <= totalColumn; j++) {
            out.write("12345");
            out.write("\t");
          }
    问题还是一样啊。to laoxing521(想做程序员的农民)
    我把 out.flush() 放到for里面可是还是内存益出啊,哪位能来帮我解决这个问题啊?help!!!!!!!!!!!!!!!!!!
      

  9.   

    兄弟,再找找看是不是程序别的地方有问题,看你上面提供的代码,应该是没问题的我下面这段代码,写文件都写了8G多了,306500行,硬盘没空间了,就让它停也下来
    但也没有内存溢出呀,再找找,问题可能出在别的地方import java.io.*;public class Demo{

    public static void main(String [] args) throws IOException{

    String s = "";
    for(int i=0; i<10000; i++){
    s+="abcdefg";
    }

    PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("c:/log/test.txt")));
    for(int i=0; i<1000000; i++){
    out.write(s);
    out.write("\r\n");
    if(i%500==0)
    System.out.println("己写入 " + i +"行");
    }
    out.flush();
    out.close();
    }
    }
      

  10.   

    30000行很大了
    1条记录算他20个字符
    那么
    (20*16*30000)/65536=146m
    默认的JAVA命令的-xmx 是占用内存的1/4
    估计老兄内存也就512M不过我觉得问题不在这里用BufferedWriter的用意是8192个char写一次
    调用的是sun.nio.cs.StreamEncoder
    StreamEncoder的源码没有开放,不过估计写的很糟糕 估计是垃圾释放的问题
    sun的isv上有说
    在JVM中如果98%的时间是用于GC且可用的Heap size 不足2%的时候将抛出此异常信息。
    所以我认为这种情况下才有了BufferedWriter(ps:class write是缓存大小是1024个char)
    用来减少释放的频率解决方法:
    重新扩展Writer的内容,但是具体内容可以模仿BufferedWriter
    但是defaultCharBufferSize要定义的大点
      

  11.   

    问题找到了就在while(rs.next()) 当rs.next()时内存不断增大,而不是写流的问题,JAVA的ResultSet真是麻烦,而且ResultSet还不能clone();谢谢laoxing521(想做程序员的农民) 帮我亲自测试。也谢谢 syoumei(赚满1000专家分去考认证) 的精彩回答,