题
如何有效地附加到大型文件。我的过程必须不断地附加到文件,并且随着文件大小的增长,性能似乎也会放慢速度。无论如何,是否可以指定一个大型缓冲区大小 append
解决方案
尽管Don的方法是有效的,但总的来说(但是,由于语法错误,它会引发例外,并且您需要 flush()
一种 BufferedOutputStream
),我一直计划进一步详细说明(这需要时间)。
groovy 不提供 I/O操作的特殊对象。因此,您将使用Java的 FileOutputStream
(用于编写字节)或 FileWriter
(用于编写字符串)。两者都提供了一个构造函数 boolean
append
范围。
两者都存在 装饰者 (BufferedOutputStream
和 BufferedWriter
),被缓冲。在此范围内,“缓冲”意味着内容不一定立即写入基础流,因此,有可能进行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输出的范围中 OutputStream
和 File
类型是相关的。
因此,最后,您可以将这些方式与“陷入困境”合作:
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