Pregunta

¿Cómo añado a archivos de gran tamaño de manera eficiente. Tengo un proceso que tiene que continuamente anexados para un archivo y que el tamaño de archivo aumenta el rendimiento parece ir más despacio también. ¿Hay alguna forma para especificar un tamaño de búfer grande con el append

¿Fue útil?

Solución

Mientras que el enfoque de Don es válido, en general (que será una excepción, sin embargo, debido a un error de sintaxis, y hay que flush() un BufferedOutputStream), he estado en la planificación a dar más detalles (que toma su tiempo).

no proporciona objetos especiales para E / S operaciones. Por lo tanto, se utiliza Java FileOutputStream (por escribir bytes) o FileWriter (para la escritura de cadenas ). Ambos proporcionan un constructor que toma un parámetro boolean append.
Por tanto, existen decoradores ( BufferedOutputStream y BufferedWriter ) , que están tamponada. "Buffering", en este ámbito, los medios, que los contenidos no son necesariamente escrito inmediatamente a la corriente subyacente, y por lo tanto, hay un potencial de E / S de optimización.

Don ya proporcionó una muestra para la BufferedOutputStream, y aquí está uno para el 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()

Mientras Groovy no proporciona sus propios objetos de E / S, la Groovy JDK (GDK) realza varios tipos de Java mediante la adición de métodos de conveniencia. En el ámbito de I / O Salida de, la OutputStream y la File tipos son relevantes.

Así que, finalmente, se puede trabajar con las del "modo maravilloso":

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

EDIT: De acuerdo con su investigación posterior:

Ninguno de los métodos GDK permite establecer un tamaño de búfer.

El código anterior "maravilloso" voluntad sobreescritura si el archivo pedido en repetidas ocasiones. - Por el contrario, el siguiente fragmento de código se anexará la cadena en un archivo existente y, por lo tanto, puede ser llamado varias veces:

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

Otros consejos

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

En la JVM en Windows la bandera append se ha implementado inefficently con una operación de búsqueda.

Este es neighter atómica ni de buen calidad al abrir el archivo varias veces. Se supone que se fija en algún lugar de la máquina virtual de Java 7: http: // errores. sun.com/bugdatabase/view_bug.do?bug_id=6631352

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top