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

Java 如何使用PrintWriter克服内存不足异常?,java,csv,printwriter,Java,Csv,Printwriter,下面的代码读取一组.csv文件,然后将它们组合成一个.csv文件。我试图系统.out.println。。。所有数据点都是正确的,但是当我尝试使用PrintWriter时,我得到: 线程“main”java.lang.OutOfMemoryError中出现异常:java堆空间 我试图使用FileWriter,但得到了相同的错误。我应该如何更正代码 public class CombineCsv { public static void main(String[] args) throws

下面的代码读取一组.csv文件,然后将它们组合成一个.csv文件。我试图
系统.out.println
。。。所有数据点都是正确的,但是当我尝试使用
PrintWriter
时,我得到:

线程“main”java.lang.OutOfMemoryError中出现异常:java堆空间

我试图使用
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);
    } 
}

我只能想到两种情况,在这两种情况下,代码可能会导致OOME:

  • 如果
    文件
    目录包含大量元素,则
    文件.listFiles()
    可以创建一个非常大的
    文件
    对象数组

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

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


我看不出为什么使用
PrintWriter
会导致问题。

试试看

boolean autoFlush=true;
PrintWriter输出=新的PrintWriter(myFileName,自动刷新)


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

谢谢您的回复。文件数量为18个。每个文件包含30000条记录(约500KB)。18个文件不应该引起问题。记录的数量也不是问题所在。我的理论是,问题在于,您正在读取的一个文件包含一条很长的行。尝试找出OOME发生时正在读取的文件,然后将其缩小到该文件中的一行。