如何有效地附加到大型文件。我的过程必须不断地附加到文件,并且随着文件大小的增长,性能似乎也会放慢速度。无论如何,是否可以指定一个大型缓冲区大小 append

有帮助吗?

解决方案

尽管Don的方法是有效的,但总的来说(但是,由于语法错误,它会引发例外,并且您需要 flush() 一种 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()

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

因此,最后,您可以将这些方式与“陷入困境”合作:

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

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

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

以上“ groovy”代码将 覆盖 文件如果重复调用。 - 相反,以下代码将将字符串附加到 现存的 文件,因此, 能够 反复称呼:

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

其他提示

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()
}

在Windows的JVM中 append 旗帜已通过寻求操作无效地实施。

这是多次打开文件时的邻居原子能,也不是非常性能的。它应该在Java VM 7中的某个地方修复: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6631352

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top