如何用PrintWriter克服内存不足的异常?

时间:2013-10-10 14:10:54

标签: java csv printwriter

以下代码读取一堆.csv文件,然后将它们合并为一个.csv文件。我尝试system.out.println ...所有数据点都是正确的,但是当我尝试使用PrintWriter时,我得到了:

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space

我尝试使用FileWriter但是遇到了同样的错误。我该如何更正我的代码?

public class CombineCsv {
    public static void main(String[] args) throws IOException {
        PrintWriter output  = new PrintWriter("C:\\User\\result.csv");
        final File file = new File("C:\\Users\\is");
        int i = 0;
        for (final File child: file.listFiles()) {
            BufferedReader CSVFile = new BufferedReader( new FileReader( "C:\\Users\\is\\"+child.getName()));
            String dataRow = CSVFile.readLine(); 
            while (dataRow != null) {
                String[] dataArray = dataRow.split(",");
                for (String item:dataArray) { 
                    System.out.println(item + "\t");
                    output.append(item+","+child.getName().replaceAll(".csv", "")+",");
                    i++;
                }
                dataRow = CSVFile.readLine(); // Read next line of data.
            } // Close the file once all data has been read.
            CSVFile.close();
        } 
        output.close();
        System.out.println(i);
    } 
}

2 个答案:

答案 0 :(得分:1)

我只能想到两种情况,即代码可能导致OOME:

  • 如果file目录中包含大量元素,则file.listFiles()可能会创建一大堆File个对象。

  • 如果其中一个输入文件包含很长的行,那么CSVFile.readLine()在读取它时会占用大量内存。 (最多为行中字节数的6倍。)

解决这两个问题的最简单方法是使用-Xmx JVM选项增加Java堆大小。


我看不出你使用PrintWriter会导致问题的原因。

答案 1 :(得分:0)

尝试

boolean autoFlush = true; PrintWriter output = new PrintWriter(myFileName, autoFlush);

它创建一个PrintWriter实例,每当有新的行或格式时,它就会刷新内容。