Groovy:附加到大文件

Eqb*_*bal 5 groovy file-writing

如何有效地附加到大文件.我有一个必须不断附加到文件的进程,随着文件大小的增加,性能似乎也会减慢.无论如何都要指定一个大的缓冲区大小append

rob*_*ert 13

虽然Don的方法是有效的,但总的来说(它会抛出一个异常,但由于语法错误,你需要flush()a BufferedOutputStream),我一直在计划进一步详细说明(花费时间).

Groovy 为I/O操作提供特殊对象.因此,您将使用Java FileOutputStream(用于写入字节)或FileWriter(用于写入字符串).两者都提供了一个带boolean append参数的构造函数.
对于两者,存在缓冲的装饰器(BufferedOutputStreamBufferedWriter).在此范围内,"缓冲"意味着内容不一定立即写入底层流,因此,存在I/O优化的可能性.

唐已经提供了一个样本BufferedOutputStream,以下是BufferedWriter:

File file = new File("foo")
if (file.exists()) {
    assert file.delete()
    assert file.createNewFile()
}

boolean append = true
FileWriter fileWriter = new FileWriter(file, append)
BufferedWriter buffWriter = new BufferedWriter(fileWriter)

100.times { buffWriter.write "foo" }

buffWriter.flush()
buffWriter.close()
Run Code Online (Sandbox Code Playgroud)

虽然Groovy不提供自己的I/O对象,但Groovy JDK(GDK)通过添加便捷方法来增强几种Java类型.在I/O输出范围内,OutputStreamFile类型是相关的.

所以,最后,你可以使用那些"Groovy方式":

new File("foo").newOutputStream().withWriter("UTF-8") { writer ->
    100.times { writer.write "foo" + it }
}
Run Code Online (Sandbox Code Playgroud)

编辑:根据您的进一步调查:

GDK方法都不允许设置缓冲区大小.

如果重复调用,上面的"Groovy"代码将覆盖该文件.- 相反,下面的代码将字符串附加到现有文件,因此可以重复调用:

new File("foo").withWriterAppend("UTF-8") { it.write("bar") }
Run Code Online (Sandbox Code Playgroud)