Groovy: Aggiunta di file di grandi dimensioni
-
29-09-2019 - |
Domanda
Come posso aggiungere al file di grandi dimensioni in modo efficiente. Ho un processo che deve continuamente di accodamento per un file e come la dimensione del file aumenta le prestazioni sembra rallentare pure. Esiste un modo per specificare una grande dimensione del buffer con l'append
Soluzione
Mentre l'approccio di Don è valida, in generale (che sarà un'eccezione, però, a causa di un errore di sintassi, ed è necessario flush()
un BufferedOutputStream
), sono stato di pianificazione per elaborare ulteriormente (che prende il suo tempo).
non fornisce oggetti speciali per I / O operazioni. Così, si può usare di Java FileOutputStream
(per scrittura bytes) o FileWriter
(per la scrittura di stringhe ). Entrambi forniscono un costruttore che prende un parametro boolean
append
.
Per entrambi, esistono decoratori ( BufferedOutputStream
e BufferedWriter
) , che sono tamponata. "Buffering", in questo ambito, significa che i contenuti non sono necessariamente scritti istantaneamente al torrente sottostante, e, quindi, c'è un potenziale di I / O di ottimizzazione I.
Don già fornito un campione per il BufferedOutputStream
, ed ecco uno per il 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()
Mentre Groovy non fornisce i propri oggetti di I / O, il Groovy JDK (GDK) migliora diversi tipi di Java con l'aggiunta di metodi di convenienza. Nell'ambito di I / O Emissione, il OutputStream
e la File
tipi sono rilevanti.
Così, finalmente, si può lavorare con coloro che la "via Groovy":
new File("foo").newOutputStream().withWriter("UTF-8") { writer ->
100.times { writer.write "foo" + it }
}
Modifica come per vostra ulteriore inchiesta:
Nessuno dei metodi GDK permette di impostare una dimensione di buffer.
Il codice di cui sopra "Groovy" sarà sovrascrittura il file, se chiamato più volte. - Al contrario, il seguente pezzo di codice aggiungerà la stringa in un esistente di file e, in tal modo, possono essere chiamati più volte:
new File("foo").withWriterAppend("UTF-8") { it.write("bar") }
Altri suggerimenti
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()
}
Nella JVM su Windows è stata implementata la bandiera append
inefficently con un'operazione di ricerca.
Questa è neighter atomica né molto performante quando si apre il file più volte. Si suppone di essere fissato da qualche parte nei Java VM 7: http: // bugs. sun.com/bugdatabase/view_bug.do?bug_id=6631352