Frage

Wie kann ich anhängen effizient große Dateien. Ich habe einen Prozess, der in einer Datei ständig append hat und wie die Dateigröße wächst die Leistung scheint auch zu verlangsamen. Gibt es trotzdem eine große Puffergröße mit dem append

angeben
War es hilfreich?

Lösung

Während Don Ansatz gilt in der Regel (es wird eine Ausnahme ausgelöst, wenn aufgrund eines Syntaxfehler, und Sie benötigen eine flush() BufferedOutputStream), habe ich die Planung gewesen weiter zu erarbeiten (die ihre Zeit in Anspruch nimmt).

bietet keine spezielle Objekte für I / O Operationen. So würden Sie verwenden Java FileOutputStream (für Schreiben von Bytes) oder FileWriter (zum Schreiben von Zeichenfolgen ). Beide bieten einen Konstruktor, der einen boolean append Parameter übernimmt.
Für beide gibt es Dekorateure ( BufferedOutputStream und BufferedWriter ) , die gepuffert. „Buffering“, in diesem Rahmen Mittel werden, dass die Inhalte nicht notwendigerweise sofort auf den zugrunde liegenden Stream geschrieben, und somit ist es ein Potential für I / O-Optimierung.

Don bereits eine Probe für die BufferedOutputStream vorgesehen, und hier ist eine für die 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()

Während Groovy liefern keine eigene E / A-Objekte, die Groovy JDK (GDK) verbessert mehrere Java-Typen durch bequeme Methoden hinzufügen. Im Rahmen der I / O-Ausgabe, die OutputStream und File Typen relevant sind.

So, endlich, können Sie mit denen arbeiten, um die "Groovy Art und Weise":

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

EDIT: Wie pro Ihre weitere Anfrage:

Keine der GDK Methoden ermöglicht eine Puffergröße einstellen.

Das oben gezeigte "Groovy" Code wird Überschreiben die Datei, wenn wiederholt aufgerufen. - Im Gegensatz dazu wird das folgende Stück Code die Zeichenfolge ein anhängen vorhandenen Datei und damit können wiederholt aufgerufen werden:

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

Andere Tipps

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

In der JVM unter Windows die append Flag wurde implementiert inefficently mit einer Suchoperation.

Das ist neighter Atom noch sehr performant, wenn die Datei mehrere Male zu öffnen. Es wird angenommen, irgendwo in der Java VM 7 fixiert werden: http: // Fehler. sun.com/bugdatabase/view_bug.do?bug_id=6631352

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top