用于创建大型CSV文件的Java IO的最佳实践

时间:2011-09-27 18:19:25

标签: java csv io

您好,我需要创建几个大型CSV文件,其中entires的顺序可能是200万。我所以我想知道如何有效地做到这一点..因此很少有问题突然出现

1。当我们通过BufferedWriter写文件时,我们应该多久刷新一次?但是我认为bufferedWriter维护自己的缓冲区,一旦缓冲区满了就会自动刷新它,如果是这样的话那么为什么那里有flush方法?

  1. 因为我要创建的文件很大。所以当我开始写文件时,文件会自动提交到磁盘吗? (在调用writer.close()之前)或整个文件保留在主内存中,直到我关闭作者?。

    • 通过提交我的意思是已经写入的部分的任何部分都没有在主存储器中,即它已准备好用于GC

4 个答案:

答案 0 :(得分:4)

  1. BufferedWriter实现应该在适当的时候做好相应的刷新工作。在您的情况下,您永远不需要致电flush

    至于为什么有flush方法,这是因为有时你会想要立即写入输出而不是等待BufferedWriter的缓冲区变满。 BufferedWriter不只是文件;它也可以用于写入控制台或套接字。例如,您可能希望通过网络发送一些数据但数据不足以导致BufferedWriter自动刷新。要立即发送此数据,您可以使用flush

  2. 您写入BufferedWriter的所有数据都不会同时保留在内存中。当BufferedWriter的缓冲区填满时,它被写成碎片(刷新)。在最后调用close后,BufferedWriter将对其缓冲区中尚未写入磁盘的所有内容执行一次最终刷新并关闭该文件。

答案 1 :(得分:3)

如果将编写器包装在BufferedWriter中,则指定在物理写入磁盘之前要在内存中保存的字节数。 (如果你没有指定,那就是默认值。我认为它是8k但请不要引用它作为福音。)

如果您使用PrintWriter,我认为它会在每行写入磁盘。

其他编写者通过每次i / o调用写入磁盘。没有缓冲。这通常会带来糟糕的表现。这就是为什么所有磁盘编写器都应该包装在BufferedWriter中。

答案 2 :(得分:0)

我倾向于分段工作,每隔1k或2k线冲到磁盘上。有了这么多数据,它似乎正在推动内存限制。由于此操作可能已经很慢,因此安全方面会失败并经常写入磁盘。

这是我的0.02美元反正:))

答案 3 :(得分:0)

BufferedWriter使用固定大小的缓冲区,并在缓冲区满时自动刷新。因此,任何大文件都将以块的形式写入。

存在flush方法,因为有时您可能希望在缓冲区已满之前将某些内容写入磁盘。一个典型的例子是包装SocketOutputStream的BufferedWriter。如果你这样做:

writer.write(request);
reader.read(response);

您的线程可能无限期阻塞,因为在缓冲区满了之前不会发送请求。你这样做:

writer.write(request);
writer.flush(); // make sure the request is sent now
reader.read(response);

代替。