OPERACJE NA PLIKACH
 
 
Odczyt z pliku
 
ZałóŜ nowy projekt i nazwij jego główną klasę Wykaz. Od razu wykasuj cały kod i przekopiuj do programu 
zawartość pliku Wykaz.java. Plik zawiera dwie klasy: klasę Student, która przechowuje informacje na temat 
pojedynczego studenta oraz klasę Wykaz, która posiada tablicę studentów. 
Przekopiuj na dysk C plik dane.txt, ma on następującą zawartość: 
 
 
 
[4] 
[STUDENT] 
Jan  
Kowalski 
[OCENY] 
[7] 
5 4 5 4 4 3 2 
[STUDENT] 
Edith 
Piaf 
[OCENY] 
[3] 
4 2 2 
[STUDENT] 
Tse Tung 
Mao 
[OCENY] 
[5] 
2 3 4 5 5 
[STUDENT] 
Ir Sen 
Kim 
[OCENY] 
[4] 
5 5 5 5 
Pierwsza czwórka oznacza, ze chcemy wczytać dane na temat czterech studentów. 
Następnie naleŜy odczytać identyfikator [STUDENT], potem imię i nazwisko a następnie 
tyle ocen, ile jest podane w kwadratowych nawiasach pod identyfikatorem [OCENY].  
Zakładamy, Ŝe plik jest skonstruowany poprawnie. 
 
Czytanie z pliku wymaga uŜycia pakietu io (input-output), zadeklaruj więc u góry: 
 
        import java.io.*; 
 
W funkcji main wpisz dwie linijki: 
 
        FileReader czytacz = new FileReader("C:\\dane.txt"); 
        BufferedReader buf = new BufferedReader(czytacz); 
 
Poczekaj chwilę i przeczytaj błąd, który zgłosi NetBeans.  
Powinno pojawić się: „
unreported exception java.io.FileNotFoundException, must be
caught or declared to be thrown
”
 
Konstrukcja łapania wyjątku wygląda podobnie jak w języku C. Przerób funkcję main tak, 
by jej zawartość wyglądała następująco: 
 
        try{ 
         
FileReader czytacz = new FileReader("C:\\dane.txt");
BufferedReader buf = new BufferedReader(czytacz);
        }catch(FileNotFoundException wyjatek){ 
              System.out.println("Nie znaleziono pliku."); 
        } 
 
W powyŜszej konstrukcji łapiemy wyjątek nieznalezienia pliku, czyli wyjątek typu
FileNotFoundException
. Typy wyjątków w Javie mają zwykle bardzo sugestywne nazwy.
 
Na razie jeszcze niczego nie odczytujemy z pliku, tylko otwieramy go do odczytu. Obiekt klasy BufferedReader 
składa znaki odczytywane z pliku w obiekty wygodniejsze do obróbki (np. w linijki, tablice, ....). 
 
Najpierw musimy odczytać pierwszą linijkę, Ŝeby wiedzieć, ilu studentów musimy przechować w tablicy. Jako dwie 
ostatnie linijki w try dopisz: 
 
        String linijka; 
        linijka = buf.readLine(); 
 
Poczekaj chwilę i przeczytaj błąd, który się pojawi. Tym razem nie obsłuŜono wyjątku java.io.IOException. 
Nie trzeba wcale dopisywać nowego try-catch’a, wystarczy zamienić w juŜ istniejącym catch’u typ
FileNotFoundException na typ IOException, poniewaŜ typ FileNotFoundException dziedziczy po 
IOException. 
 
Z pierwszej odczytanej linijki naleŜy wyciąć klamerki i to co zostanie zamienić na liczbę. Jako ostatnie linijki w try 
wklej: 
 
linijka = linijka.substring(linijka.indexOf('[')+1,linijka.indexOf(']')); 
wykazStudentow = new Student[Integer.parseInt(linijka)]; 
 
Dla sprawdzenia, czy tablica studentów została poprawnie zainicjowana, moŜesz wpisać w funkcji main: 
 
System.out.println(wykazStudentow.length); 
 
Program powinien wypisać cyfrę 4. 
 
Jako ostatnią linijkę w try wpisz pomocnicze zmienne: 
 
String imie, nazwisko, ile, listaOcen,ocenyPoszczegolne[];
mgr Agnieszka Patyk, Wydział FTiMS, Politechnika Gdańska, 2007
Skoro wiemy juŜ ilu mamy studentów, moŜemy odczytać ich dane w pętli for (jako ostatnie linijki w try): 
 
 
for(int i=0;i<wykazStudentow.length;i++){ 
 
            buf.readLine(); 
// 1 linijka na [STUDENT], nigdzie jej nie zapamiętujemy
 
            imie = buf.readLine(); 
            nazwisko = buf.readLine(); 
 
            buf.readLine(); 
// 1 linijka na [OCENY], nigdzie jej nie zapamiętujemy
ile = buf.readLine();
// liczba ocen w klamerkach - trzeba je wyciąć:
            ile = ile.substring(ile.indexOf('[')+1,ile.indexOf(']')); 
             
            
// mamy juŜ wszystkie potrzebne dane do utworzenia obiektu
            wykazStudentow[i] = new Student(imie,nazwisko,Integer.parseInt(ile)); 
             
// odczytujemy oceny:
            listaOcen = buf.readLine(); 
 
// linijka z ocenami jest postaci „liczba spacja liczba spacja ....”, więc rozcinamy ją po spacjach i
// wrzucamy pozostałe jej części do tablicy ocenyPoszczegolne:
            ocenyPoszczegolne = new String[wykazStudentow[i].oceny.length]; 
            ocenyPoszczegolne = listaOcen.split(" "); 
 
// trzeba jeszcze przerobić napisy z ocenami na liczby:
            for(int k=0;k<wykazStudentow[i].oceny.length;k++) 
                wykazStudentow[i].oceny[k] = Double.parseDouble(ocenyPoszczegolne[k]); 
             
    }
 
 
 
MoŜna juŜ napisać w funkcji main: 
 
for(int i=0;i<wykazStudentow.length;i++) 
            System.out.println(wykazStudentow[i]); 
 
Przetestuj, czy program prawidłowo wyświetla informacje o studentach. 
 
Zapis do pliku
 
W tym samym programie pod koniec try wpisz: 
 
       FileWriter pisacz = new FileWriter("C:\\wyniki.txt"); 
         
       for(int i=0;i<wykazStudentow.length;i++) 
              pisacz.write(wykazStudentow[i].toString()+"\n"); 
        
       pisacz.close(); 
 
Przetestuj program. 
 
Otwórz plik wyniki.txt w Notatniku. Najprawdopodobniej przejście do nowej linii oznaczone jest kwadracikiem. 
W programie dwa razy występuje 
\n
(raz w funkcji toString i raz w zapisie do pliku)– zamień to na
\r\n
i
jeszcze raz uruchom program. Ponownie otwórz plik wyniki.txt w Notatniku.
mgr Agnieszka Patyk, Wydział FTiMS, Politechnika Gdańska, 2007