【问题标题】:What's the most efficient way to write large text file in java?用java编写大型文本文件的最有效方法是什么?
【发布时间】:2011-12-06 21:27:50
【问题描述】:

我正在尝试使用以下方法编写包含一些数据的文件:

public static <T extends SomeClass> void writeFile(String buffer, Class<T> clazz, int fileNumber) {
    String fileType = ".txt";
    File file = new File(clazz.getName()+fileNumber+fileType);
    PrintWriter printWriter = null;


    try {
        FileWriter writer = new FileWriter(file);
        printWriter = new PrintWriter(writer);
        printWriter.print(buffer);//error occurs here
        printWriter.flush();
        printWriter.close();
        System.out.println("created file: "+file.getName());


    } catch (IOException e) {
        e.printStackTrace();
    } finally{
        if(printWriter!=null){
            printWriter.flush();
            printWriter.close();
        }
    }
    System.out.println("Done!");
}

缓冲区字符串包含 +-6mb 的数据,当我运行代码时,我在缓冲区中得到一个 java.lang.OutOfMemoryError。

【问题讨论】:

  • 您是否使用 -Xmx 命令行选项为您的 Java VM 提供了合理的内存量?
  • 您是否尝试将缓冲区写入较小的块而不是单个调用?
  • 顺便说一句,我认为 PrintWriter.write 使用内存的原因是它将整个字符串编码为一个字节数组,然后写入。

标签: java file-io out-of-memory heap-memory


【解决方案1】:

由于 6mb 并不是那么多“数据”,我认为你应该增加你的 java VM 内存,

看这里

http://confluence.atlassian.com/display/DOC/Fix+Out+of+Memory+Errors+by+Increasing+Available+Memory

【讨论】:

    【解决方案2】:

    printWriter.print(buffer); 替换为:

    for (int i = 0; i < buffer.length; i += 100) {
        int end = i + 100;
    
        if (end >= buffer.length) {
            end = buffer.length;
        }
    
        printWriter.print(buffer.substring(i, end);
        printWriter.flush();
    }
    

    【讨论】:

    • 程序员现在已经习惯了拥有这么多内存,他们从没想过要保存它。生活就是平衡。
    • @Thom:同意你的观点,但平衡意味着以正确的方式使用尽可能多的资源。 ;)
    • 平衡意味着以正确的方式使用适量的资源。
    猜你喜欢
    • 2014-05-16
    • 1970-01-01
    • 1970-01-01
    • 2015-08-04
    • 1970-01-01
    • 1970-01-01
    • 2014-11-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多