Odczyt i zapis danych w tym samym pliku

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();
            }
        }
    }
    
}
0

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

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.

0

To pokaż kod w którym to robisz

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();
            }
        }
    }
    
}
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

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

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

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();
            }
        }
    }
    
}
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ół

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.

0

Czyli tak jak wczesniej podejrzewałem write usuwa poprzednią zawartość. Tablica Stringów będzie lepszym rozwiązaniem, ale co wtedy gdy inicjałów jest więcej niż 100?

0

To zapewne trzeba by odpowiednio zaimplementować wedlug własnych wymagań, w moim przypadku akurat ustawiłem 100 ponieważ taka wartość była mi potrzebna do wykonania zadania.

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