Input/Output Datei ändern

Diskutiere Datei ändern im Allgemeine Java-Themen Forum; Hallo Forum, ich möchte Dateien mittels Streams lesen und schreiben. Meistens kommt es dabei aber vor, dass die Datei mit fixer Größe schon...

  1. bene2808
    bene2808 Mitglied
    Hallo Forum,

    ich möchte Dateien mittels Streams lesen und schreiben. Meistens kommt es dabei aber vor, dass die Datei mit fixer Größe schon existiert und an einigen Stellen verändert werden soll. Jetzt habe ich schon von der Pauschal-Strategie gehört, einfach die gesamte Datei einzulesen, die Daten an den betreffenden Stellen abzuändern und das Ergebnis wieder in die Datei zurückzuschreiben. Wahlweise auch die Datei Byte für Byte einzulesen und instant in eine temporäre Datei zu schreiben, um den Arbeitsspeicher-Verbrauch gering zu halten.

    Das Verfahren ist aber trotzdem recht ineffizient für große Dateien. Ist es nicht möglich, tatsächlich einzelne Bytes einer bestehenden Datei direkt zu ersetzen?

    Danke für Eure Hilfe! :)
     
  2. Vielleicht hilft dir dieser Kurs hier weiter --> (hier klicken)
  3. VfL_Freak
    VfL_Freak Bekanntes Mitglied
    bene2808 gefällt das.
  4. bene2808
    bene2808 Mitglied
    Ja perfekt, danach habe ich gesucht, danke dir! :)

    Gibt es auch eine Möglichkeit, zusätzliche Bytes in der Mitte der Datei einzufügen? Sodass die Bytes dahinter automatisch "nach rechts" verschoben werden?
     
  5. Cromewell
    Cromewell Aktives Mitglied
  6. bene2808
    bene2808 Mitglied
    Hab die Tutorials überflogen und jetzt nicht direkt gefunden, wie man's mit dem RandomAccessFile hinkriegen würde. Die Channels klangen interessant, aber habe überhaupt keinen Überblick da...

    Läuft es dann darauf raus, dass man mehr Bytes für die Datei nachfragt und dann die zu weit vorne liegenden Bytes nach hinten schiebt? Bitte um Beispiel... :D
     
  7. Cromewell
    Cromewell Aktives Mitglied
    Hast du den Link, den ich geschickt habe, angeguckt?
    Dort steht das folgende Beispiel, um bytes in eine Datei einzufügen:
    Code (Java):

    public static void aMethod(){
       RandomAccessFile f = new RandomAccessFile(new File("whereDidIPutTHatFile"), "rw");
       long aPositionWhereIWantToGo = 99;
       f.seek(aPositionWhereIWantToGo); // this basically reads n bytes in the file
       f.write("Im in teh fil, writn bites".getBytes());
       f.close();
    }
     
     
  8. bene2808
    bene2808 Mitglied
    Ja, habe ich natürlich :)
    Aber ich dachte dieses Beispiel würde an Byte 99 beginnend in eine Datei schreiben, die schon über den nötigen Speicher verfügt? Oder wird der dynamisch erweitert?
    Ich dachte, die write-Methoden wären mehr zum BESCHREIBEN von vorhandenen Bytes und nicht zum EINFÜGEN neuer Bytes...:confused:
     
  9. Cromewell
    Cromewell Aktives Mitglied
    Erstell dir eine Testdatei und Probier es aus ;)

    Edit: Du musst wissen, dass es das Nachfolgende überschreibt. Willst du dieses aber auch haben, musst du es vorher einlesen und dann anfügen.
     
    Zuletzt bearbeitet: 8. Jan. 2017
  10. bene2808
    bene2808 Mitglied
    Aja genau das wollte ich wissen, danke :) ! Also muss ich zum tatsächlichen Einfügen alles, was hintergeschoben werden soll einlesen und weiter hinten wieder schreiben...
    Und wie könnte man dieses Lesen und Schreiben jetzt möglichst effizient gestalten? Also es sollte nicht alles im Arbeitsspeicher gehalten werden, bis es wieder zurückgeschrieben wird, da Arbeitsspeicher in meiner Anwendung rar ist und die Bytefolgen sehr lang werden könnten. Wenn ich aber Byte für Byte lese und schreibe, muss ich ja eigentlich hinten an der Bytefolge anfangen und nach vorne gehen. Und dafür müsste ich ja wirklich vor jeder Lese-/Schreiboperation hin und her springen... Gäb's da auch was besseres?o_O

    Man könnte natürlich auch puffern, also immer z.B. 1024 Bytes lesen und dann schreiben usw., ist mir schon klar... Aber ich meine gibt es auch eine grundsätzlich andere Strategie, die einem die gesamte Bytesequenz verschiebt?
     
    Zuletzt bearbeitet: 8. Jan. 2017
  11. bene2808
    bene2808 Mitglied
    Gut ist ok, wenn es für das Verschieben keine bessere Strategie gibt :D

    Aber: ich habe festgestellt, dass es sehr viel effizienter ist, auch beim "normalen" Lesen und Schreiben größere Byte-Segmente einzulesen bzw. auf einmal zu schreiben (Ja ich weiß, ich bin da Anfänger:D). Für Streams gibt es dafür BufferedInput- und -OutputStream. Gibt es sowas auch für RandomAccessFile?

    Würde mich freuen, wenn noch mal wer antwortet:)
     
Die Seite wird geladen...

Datei ändern - Ähnliche Themen

.txt Datei einlesen, verändern und in LinkedList speichern
.txt Datei einlesen, verändern und in LinkedList speichern im Forum Hausaufgaben
BenutzerDaten teilweise ändern in txt Datei
BenutzerDaten teilweise ändern in txt Datei im Forum Java Basics - Anfänger-Themen
Das Ende von bestimmten zeilen in text datei ändern und speichern
Das Ende von bestimmten zeilen in text datei ändern und speichern im Forum Allgemeine Java-Themen
Icon einer JNLP-Datei ändern ??
Icon einer JNLP-Datei ändern ?? im Forum Deployment
fxml datein mit menübar ändern
fxml datein mit menübar ändern im Forum AWT, Swing, JavaFX & SWT
Thema: Datei ändern