Odczyt i zapis danych w tym samym pliku

Odpowiedz Nowy wątek
2020-01-18 13:22

Rejestracja: 3 miesiące temu

Ostatnio: 1 tydzień temu

0

Dzień dobry,
Staram napisać się program który będzie pobierał dane z pliku tekstowego (w jednym wierszu znajduje się imię i nazwisko) następnie chcę uzyskać z tego wiersza inicjały danej osoby i na koniec zapisać je do tego samego pliku usuwając poprzednią zawartość, lecz w momencie gdy program uruchomię wszystkie dane z pliku są kasowane. Szukałem już pomocy w internecie lecz większość rozwiązań jest dla mnie nie zrozumiała lub po prostu nie działa. Bardzo prosiłbym o wskazanie sposobu w jaki można rozwiązać mój problem.
Oto mój dotychczasowy kod:

package odczytzapistensamplik;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class OdczytZapisTenSamPlik {

    public static void main(String[] args) throws IOException{
        BufferedReader odczytPliku = null;
        FileWriter zapisPliku = null;

        try
        {
            odczytPliku = new BufferedReader(new FileReader("D:/NetBeans/Projekty/Testowanie/wejscieWyjscie.txt"));
            String calyWiersz;
            zapisPliku = new FileWriter("D:/NetBeans/Projekty/Testowanie/wejscieWyjscie.txt");
            while((calyWiersz = odczytPliku.readLine()) != null )
            {
                String[] tablicaSlow = new String[2];
                char znakImienia;
                char znakNazwiska;

                tablicaSlow = calyWiersz.split(" ");
                znakImienia = tablicaSlow[0].charAt(0);
                znakNazwiska = tablicaSlow[1].charAt(0);

                System.out.println("Inicjały: " + znakImienia + "." + znakNazwiska + ".");

                String inicjaly = znakImienia + "." + znakNazwiska + ".";

                zapisPliku.write(inicjaly);

            }     
        }
        finally
        {
            if(odczytPliku != null)
            {
                odczytPliku.close();
            }
            if(zapisPliku != null)
            {
                zapisPliku.close();
            }
        }
    }

}

Pozostało 580 znaków

2020-01-18 13:52

Rejestracja: 11 miesięcy temu

Ostatnio: 1 godzina temu

0

Nie powinieneś czasem w iteracji zapisywać inicjały do zmiennej i dopiero po przejściu przez pętlę zapisać do pliku?

Pozostało 580 znaków

2020-01-18 14:01

Rejestracja: 3 miesiące temu

Ostatnio: 1 tydzień temu

0

Też mi coś takiego przeszło przez mysl, więc zacząłem zapisywać wszystko do tablicy i później z tej tablicy do pliku, ale niestety to też nie pomogło.

Pozostało 580 znaków

2020-01-18 14:03

Rejestracja: 11 miesięcy temu

Ostatnio: 1 godzina temu

0

To pokaż kod w którym to robisz

Pozostało 580 znaków

2020-01-18 14:18

Rejestracja: 3 miesiące temu

Ostatnio: 1 tydzień temu

0

W takim momencie niestety po wyjściu z pętli while wszystkie dane z tablicy są usuwane, z nie wiadomego mi powodu.

package odczytzapistensamplik;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class OdczytZapisTenSamPlik {

    public static void main(String[] args) throws IOException{
        BufferedReader odczytPliku = null;
        FileWriter zapisPliku = null;

        try
        {
            odczytPliku = new BufferedReader(new FileReader("D:/NetBeans/Projekty/Testowanie/wejscieWyjscie.txt"));
            String calyWiersz;
            zapisPliku = new FileWriter("D:/NetBeans/Projekty/Testowanie/wejscieWyjscie.txt");
            String[] tablicaInicjalow = new String[100];
            int indeksTI = 0;
            while((calyWiersz = odczytPliku.readLine()) != null )
            {
                String[] tablicaSlow = new String[2];

                char znakImienia;
                char znakNazwiska;

                tablicaSlow = calyWiersz.split(" ");
                znakImienia = tablicaSlow[0].charAt(0);
                znakNazwiska = tablicaSlow[1].charAt(0);

                String inicjaly = znakImienia + "." + znakNazwiska + ".";

                tablicaInicjalow[indeksTI] = inicjaly;
                indeksTI++;

            }

            for(int i = 0; i < tablicaInicjalow.length;i++)
            {
                zapisPliku.write(tablicaInicjalow[i]);
                zapisPliku.write(System.lineSeparator());
            }

        }
        finally
        {
            if(odczytPliku != null)
            {
                odczytPliku.close();
            }
            if(zapisPliku != null)
            {
                zapisPliku.close();
            }
        }
    }

}

Pozostało 580 znaków

2020-01-18 14:24

Rejestracja: 11 miesięcy temu

Ostatnio: 1 godzina temu

1

Nie do końca pamiętam api FileWriter ale zdaje mi się że write() zapisując dane do pliku usuwa wszystkie poprzednie dane. Jeśli tak to pierwsza iteracja pętli for usuwa wszystko i zapisuje jeden inicjał, druga iteracja usuwa pierwszy inicjał i wstawia tylko drugi. Sprawdź czy istnieje metoda która zapisuje tablicę do pliku, jeśli nie to może połącz elementy tablicy w jeden String, chociaż jakoś tak za bardzo nie podoba mi się te rozwiązanie

edytowany 1x, ostatnio: Orenz12, 2020-01-18 14:24

Pozostało 580 znaków

2020-01-18 18:04

Rejestracja: 3 miesiące temu

Ostatnio: 1 tydzień temu

0

Mam podejrzenie ze problem nie występuję we write ponieważ nawet po usunięciu zapisywania czegokolwiek do pliku, program jedynie usuwa wszystkie dane z pliku

Pozostało 580 znaków

2020-01-18 18:05

Rejestracja: 11 miesięcy temu

Ostatnio: 1 godzina temu

1

Sprawdź czy new FileWritter z podaną ścieżką to robi, możliwe że od razu tworzy plik o tej nazwie, wtedy się czyści

Pozostało 580 znaków

2020-01-18 18:09

Rejestracja: 3 miesiące temu

Ostatnio: 1 tydzień temu

0

Nie wiem czy dokładnie to miałeś na myśli, ale zrozumiałem to tak żeby przenieść FileWriter gdzieś dalej tzn. poza pętle while i zacząć wpisywanie. Po czymś takim program zadziałał. Dziękuję za wszelkie porady, bardzo mnie naprowadziły do rozwiązania.

package odczytzapistensamplik;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class OdczytZapisTenSamPlik {

    public static void main(String[] args) throws IOException{
        BufferedReader odczytPliku = null;
        FileWriter zapisPliku = null;

        try
        {
            odczytPliku = new BufferedReader(new FileReader("D:/NetBeans/Projekty/Testowanie/wejscieWyjscie.txt"));
            String calyWiersz;

            String[] tablicaInicjalow = new String[100];
            int indeksTI = 0;
            while((calyWiersz = odczytPliku.readLine()) != null )
            {
                String[] tablicaSlow = new String[2];

                char znakImienia;
                char znakNazwiska;

                tablicaSlow = calyWiersz.split(" ");
                znakImienia = tablicaSlow[0].charAt(0);
                znakNazwiska = tablicaSlow[1].charAt(0);

                String inicjaly = znakImienia + "." + znakNazwiska + ".";

                tablicaInicjalow[indeksTI] = inicjaly;
                indeksTI++;

            }

            zapisPliku = new FileWriter("D:/NetBeans/Projekty/Testowanie/wejscieWyjscie.txt");

            for(int i = 0; i < indeksTI; i++)
            {
                zapisPliku.write(tablicaInicjalow[i]);
                zapisPliku.write(System.lineSeparator());
            }

        }
        finally
        {
            if(odczytPliku != null)
            {
                odczytPliku.close();
            }
            if(zapisPliku != null)
            {
                zapisPliku.close();
            }
        }
    }

}

Pozostało 580 znaków

2020-01-18 18:12

Rejestracja: 11 miesięcy temu

Ostatnio: 1 godzina temu

0

Nie miałem żadnego rozwiązania na myśli, chciałem byś sam jakieś wymyślił. Te wygląda spoko :) A tak przy okazji to co by się działo gdybyś używał write() w pętli while zamiast ładował dane do tablicy i forował? Czyli to co za pierwszym razem pokazałeś ale z przeniesieniem tworzenia obiektu FileWriter na dół

Pozostało 580 znaków

2020-01-18 18:22

Rejestracja: 3 miesiące temu

Ostatnio: 1 tydzień temu

0

Jeżeli w pliku jest jedna osoba wszystko jest w porządku, ale problem zaczyna się gdy w pliku jest więcej imion i nazwisko, wtedy zostają zapisane tylko inicjały ostatniej osoby.

Pozostało 580 znaków

Odpowiedz

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