質問

大きなファイルに効率的に追加するにはどうすればよいですか。ファイルに継続的に追加する必要があるプロセスがあり、ファイルサイズが拡大するにつれてパフォーマンスも低下するようです。とにかく、で大きなバッファサイズを指定するためにありますか append

役に立ちましたか?

解決

ドンのアプローチは一般的に有効ですが(ただし、構文エラーのために例外がスローされ、そうする必要があります。 flush() a BufferedOutputStream)、私はさらに詳しく説明することを計画していました(時間がかかります)。

グルーヴィー 提供していません I/O操作のための特別なオブジェクト。したがって、Javaを使用します FileOutputStream (バイトの書き込み用)または FileWriter (文字列を書くため)。どちらも、を取るコンストラクターを提供します boolean append パラメーター。
両方のために、存在します デコレーター (BufferedOutputStreamBufferedWriter)、バッファリングされています。この範囲では、「バッファリング」は、コンテンツが必ずしも基礎となるストリームに即座に記述されるわけではないことを意味します。したがって、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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top