Groovy:附加到大文件

Groovy:附加到大文件,groovy,file-writing,Groovy,File Writing,如何有效地附加到大型文件。我有一个必须不断附加到文件的过程,随着文件大小的增长,性能似乎也会降低。当Don的方法通常是有效的时(由于语法错误,它会抛出一个异常,并且您需要flush()aBufferedOutputStream),我一直计划进一步阐述(这需要时间) def file = new File('/path/to/file') // Create an output stream that writes to the file in 'append' mode def fileOut

如何有效地附加到大型文件。我有一个必须不断附加到文件的过程,随着文件大小的增长,性能似乎也会降低。当Don的方法通常是有效的时(由于语法错误,它会抛出一个异常,并且您需要
flush()
a
BufferedOutputStream
),我一直计划进一步阐述(这需要时间)

def file = new File('/path/to/file')

// Create an output stream that writes to the file in 'append' mode
def fileOutput = new FileOutputStream(file, true)

// Buffer the output - set bufferSize to whatever size buffer you want to use
def bufferSize = 512
def fileOutput = new BufferedOutputStream(fileOutput, bufferSize)

try {
    byte[] contentToAppend = // Get the content to write to the file
    fileOutput.write(contentToAppend)
} finally {
    fileOutput.close()
}
用于I/O操作的Groovy特殊对象。因此,您可以使用Java(用于写入字节)或(用于写入字符串)。两者都提供了一个构造函数,该构造函数接受一个
boolean
append
参数。
对于这两种情况,都存在装饰器(和),它们被缓冲。在这个范围内,“缓冲”意味着内容不一定立即写入底层流,因此,有可能进行I/O优化

Don已经为
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()
虽然Groovy不提供自己的I/O对象,但通过添加方便的方法增强了几种Java类型。在I/O输出范围内,和类型是相关的

最后,您可以使用“Groovy方式”来处理这些问题:


编辑:根据您的进一步询问:

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

如果重复调用,上述“Groovy”代码将覆盖该文件。-相反,以下代码将字符串附加到现有文件中,因此可以重复调用:

new File("foo").withWriterAppend("UTF-8") { it.write("bar") }

在Windows上的JVM中,
append
标志已通过查找操作无效地实现


当多次打开文件时,这不是很好,也不是很有效。它应该在Java VM 7中的某个地方修复:

Groovy很容易接受Java语法,并且在JVM上,因此可以提出这样一个问题:“如何使用GDK或JDK有效地附加到大型文件?”下面的第一个答案使用这种逻辑。如果我一次性附加到文件,这很好。如果该文件已经存在,这是否也可以工作?同样以groovy的方式,如何指定缓冲区大小?
new File("foo").withWriterAppend("UTF-8") { it.write("bar") }