Input/Output Datei ändern

Dieses Thema Input/Output - Datei ändern im Forum "Allgemeine Java-Themen" wurde erstellt von bene2808, 6. Jan. 2017.

Thema: Datei ändern Hallo Forum, ich möchte Dateien mittels Streams lesen und schreiben. Meistens kommt es dabei aber vor, dass die...

  1. 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 helfen dir diese Java-Grundlagen weiter --> *Klick*
  3. bene2808 gefällt das.
  4. 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. 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
     
  6. 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();
    }
     
     
  7. 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:
     
  8. 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
  9. 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
  10. KOSTENLOSES Java-Grundlagen Training im Wert von 39 € Sichere dir hier den kostenlosen Zugriff auf umfangreiches Java-Know How und starte richtig durch!