background image

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 

background image

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