Edycja pliku

0

Znalazłem kod do edytowania pliku.

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;

public class Pliki_RAF {

  public static void main(String[] args) {

     String tekst="";
     long pozycja=0, dlugoscpliku=0;
     RandomAccessFile raf = null;

     // OTWIERANIE PLIKU I WYBÓR TRYBU ODCZYTU - "r" (zapis - "w",  zapis/odczyt "rw")
     try {
        raf = new RandomAccessFile("plik.txt", "r");
      } catch (FileNotFoundException e) {
          System.out.println("BŁĄD PRZY OTWIERANIU PLIKU!");
          System.exit(1);
      }

     // SWOBODNY ODCZYT Z PLIKU
     try { 
        dlugoscpliku = raf.length();
        System.out.println("Dlugosc pliku: " + dlugoscpliku);
        raf.seek(0); // "skok" na początek pliku
        while (pozycja < dlugoscpliku){
              tekst += raf.readLine(); 
              pozycja= raf.getFilePointer();
         }
      } catch (IOException e1) {
            System.out.println("BŁĄD ODCZYTU Z PLIKU!");
            System.exit(2);
       }

      //ZAMYKANIE PLIKU: 
      try {
          raf.close();
       } catch (IOException e) {
             System.out.println("BŁĄD PRZY ZAMYKANIU PLIKU!");
             System.exit(3); 
       }

       System.out.println("Wczytane wyrazy: " + tekst);
       System.out.println("polozenie wskaznika :" + pozycja);
  }
}

Mam z nim problem ponieważ jak mam fragment kod

 String c="8";
  ...
  raf.seek(0); 
  raf.writeChars(c);

i plik przykładowo
1 1 1 1
To po puszczeniu tej metody uzyskuje
81 1 1
Czyli tak jakby liczba dodana jest na 2 pozycje pomimo że wskaźnik ustawiony jest na 1 pozycji.
Może ktoś mi wytłumaczyć dlaczego tak się dzieje :P ?

0

Pokazujesz kod który czyta a mówisz o problemie z zapisem, bezsens. Pokaż cały kod który ci nie działa.

0

Przecież wystarczy że

raf = new RandomAccessFile("plik.txt", "r");

na

raf = new RandomAccessFile("plik.txt", "rw");

i mam czytanie wraz z zapisywanie.
To jest jedyna metoda z której korzystam do edytowania.
Działa tylko dodaje miejsce o jeden dalej niż powinien.

1

writeChars każdy znak stringa zapisuje jako utf-16 big endian, czyli jeden znak zajmuje dwa bajty.
Z kolei writeBytes zapisuje każdy znak w jednym bajcie — starszy bajt jest ucinany. Czyli to, czego chcesz.

1 użytkowników online, w tym zalogowanych: 0, gości: 1