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

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top