Java 循环期间动态写入CSV

Java 循环期间动态写入CSV,java,csv,memory-management,io,garbage-collection,Java,Csv,Memory Management,Io,Garbage Collection,我正在处理静态void main(String[]args)中的一个巨大循环。这个循环操作一些我想要进入CSV的数值原语,CSV中的每一行对应于循环中的一个迭代 我的目标是动态地编写这些原语,这样在每次迭代结束时,它们就可以被垃圾收集并基本上被遗忘。最糟糕的事情是将这些存储在内存中,直到循环结束,因为循环非常长 我已经写了一个类来尝试这样做,粘贴在下面问题:是否将CSV的每一行存储到内存中,然后在循环结束时写入磁盘?如果是这样,我如何使磁盘写入在每次循环迭代时都发生,以释放内存(最好是以一种快速

我正在处理
静态void main(String[]args)
中的一个巨大循环。这个循环操作一些我想要进入CSV的数值原语,CSV中的每一行对应于循环中的一个迭代

我的目标是动态地编写这些原语,这样在每次迭代结束时,它们就可以被垃圾收集并基本上被遗忘。最糟糕的事情是将这些存储在内存中,直到循环结束,因为循环非常长

我已经写了一个类来尝试这样做,粘贴在下面问题:是否将CSV的每一行存储到内存中,然后在循环结束时写入磁盘?如果是这样,我如何使磁盘写入在每次循环迭代时都发生,以释放内存(最好是以一种快速的方式)


为了记忆和使用。你不会打败操作系统(最有可能)。番石榴对此很方便。

当您使用时,它可能不会在循环结束时写入文件。这取决于您的数据大小。BufferedWriter使用8192作为写入文件的默认大小,这意味着它不会写入文件,除非写入程序缓存的数据大小达到8192

那么,您是说它当前正在将*所有的
int
s存储到内存中,直到我调用
close()
?它允许您像处理内存缓冲区一样处理文件。它将自动刷新它(或者如果要强制它,您可以调用buffer.force(),这里的讨论:)也许您可以举个例子?
public static void main(String[] args) throws Exception {
    WriteCSV csvWriter = new WriteCSV("src","Hello.csv")

    for(int i = 0 ; i < 1000 ; ++i) { //Much bigger in real-world case
        csvWriter.writeRow(i);
    }
    csvWriter.close(); //Does all i between {1,2,...,1000} get GC'd here or dynamically in the above loop???
}
class WriteCSV {
    private FileWriter fstream;
    private BufferedWriter out;


    public WriteCSV(String directory, String filename) throws IOException {     
        File file = new File(directory, filename);

        this.fstream = new FileWriter(file);
        this.out = new BufferedWriter(this.fstream);
    }


    public void writeRow(int newRow) throws IOException {
        this.out.write(String.valueOf(newRow));
        this.out.newLine();
    }

    public void close() throws IOException {
        this.out.close();
    }

}