Eqb*_*bal 5 groovy file-writing
如何有效地附加到大文件.我有一个必须不断附加到文件的进程,随着文件大小的增加,性能似乎也会减慢.无论如何都要指定一个大的缓冲区大小append
rob*_*ert 13
虽然Don的方法是有效的,但总的来说(它会抛出一个异常,但由于语法错误,你需要flush()a 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()
Run Code Online (Sandbox Code Playgroud)
虽然Groovy不提供自己的I/O对象,但Groovy JDK(GDK)通过添加便捷方法来增强几种Java类型.在I/O输出范围内,OutputStream和File类型是相关的.
所以,最后,你可以使用那些"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)
| 归档时间: |
|
| 查看次数: |
15112 次 |
| 最近记录: |