0

以下代码读取一堆 .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);
    } 
}
4

2 回答 2

1

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

  • 如果file目录有非常多的元素,那么file.listFiles()可以创建非常大的File对象数组。

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

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


我看不出为什么您使用 aPrintWriter会成为问题的原因。

于 2013-10-10T14:32:14.657 回答
0

尝试

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

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

于 2016-02-02T00:33:52.563 回答