2012-10-01 5 views
7

Mögliche Duplizieren:
Best Way to Write Bytes in the Middle of a File in JavaWrite Bytes in eine Datei, ohne vorhandenes Bytes Löschen

Ich habe eine Datei, in der ich brauche Bytes zu schreiben.

Ich weiß an welcher Position in der Datei muss ich einfügen spezifische Bytes. Um das klarzustellen, muss ich Bytes in der Mitte der Datei schreiben, ohne irgendwelche existierenden Bytes zu löschen. Die gesamte Operation sollte dann die Länge der Datei erhöhen.

Was ist der beste Weg?

+0

http://stackoverflow.com/questions/181408/best-way-to-write-bytes-in-the-middle-of-a-file-in-java – gtgaxiola

+0

Bereits versucht, leider meine Implementierung nicht hinzufügen Bytes aber lösche existierende Bytes, was ist der Trick für das Einfügen? –

+0

@gtgaxiola: Das wird nicht funktionieren, weil es die vorhandenen Bytes überschreiben wird –

Antwort

4

Der einzige Weg, dies zu tun, ist das Verschieben der Bytes, die gerade im Weg sind. Abhängig davon, wie oft Sie dies tun müssen und wie groß die Datei ist, ist es oft eine bessere Idee, eine neue Datei zu erstellen, die vorhandene Datei zu kopieren und die neuen Bytes einzufügen.

Wenn Sie die Datei selten zu aktualisieren, oder es ist klein (bis vielleicht 100 kb) Sie können ein verwenden RandomAccessFile:

  1. die Datei erweitern, die setLength() Methode verwendet, um die Anzahl von Bytes Hinzufügen Sie Einfügen in das, was von der length() Methode zurückgegeben wird.
  2. Wenn genügend Speicher vorhanden ist, erstellen Sie eine byte[], die alle Bytes vom Einfügepunkt bis zum vorherigen Ende der Datei enthält.
  3. Anruf seek() am Einfügepunkt
  4. Anruf readFully() zu positionieren temporären Array
  5. Anruf zu füllen seek() am Einfügepunkt + die Anzahl von Bytes positionieren
  6. Anruf einzufügen write() Ihre Puffer bei, dass zu schreiben Punkt
  7. Anruf seek() am Einfügepunkt repositionieren
  8. Anruf `write()
der neuen Bytes zu schreiben,

Wenn Sie in Schritt 2 kein ausreichend großes Array erstellen können, müssen Sie die Schritte 3-6 in einer Schleife mit einem kleineren Puffer durchführen. Ich würde mindestens einen 64k-Puffer für die Effizienz verwenden.

+0

+1 sehr gut abgedeckt. –