質問
大きなファイルに効率的に追加するにはどうすればよいですか。ファイルに継続的に追加する必要があるプロセスがあり、ファイルサイズが拡大するにつれてパフォーマンスも低下するようです。とにかく、で大きなバッファサイズを指定するためにありますか append
解決
ドンのアプローチは一般的に有効ですが(ただし、構文エラーのために例外がスローされ、そうする必要があります。 flush()
a BufferedOutputStream
)、私はさらに詳しく説明することを計画していました(時間がかかります)。
グルーヴィー 提供していません I/O操作のための特別なオブジェクト。したがって、Javaを使用します FileOutputStream
(バイトの書き込み用)または FileWriter
(文字列を書くため)。どちらも、を取るコンストラクターを提供します boolean
append
パラメーター。
両方のために、存在します デコレーター (BufferedOutputStream
と BufferedWriter
)、バッファリングされています。この範囲では、「バッファリング」は、コンテンツが必ずしも基礎となるストリームに即座に記述されるわけではないことを意味します。したがって、I/Oの最適化の可能性があります。
ドンはすでにサンプルを提供しました BufferedOutputStream
, 、そしてこれが1つです 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オブジェクトを提供していませんが、 グルーヴィーJDK(GDK) 便利な方法を追加することにより、いくつかのJavaタイプを強化します。 I/O出力の範囲で、 OutputStream
そしてその File
タイプが関連しています。
だから、最後に、あなたはそれらの「グルーヴィーな方法」と一緒に作業することができます:
new File("foo").newOutputStream().withWriter("UTF-8") { writer ->
100.times { writer.write "foo" + it }
}
編集: あなたのさらなる問い合わせに従って:
GDKメソッドのいずれも、バッファサイズを設定することはできません。
上記の「グルーヴィー」コードが行われます 上書きします 繰り返し呼び出された場合のファイル。 - 対照的に、次のコードは文字列をに追加します 既存 ファイル、したがって、 できる 繰り返し呼ばれる:
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