mgr Agnieszka Patyk, Wydział FTiMS, Politechnika Gdańska, 2007

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ść:

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

[4]

tyle ocen, ile jest podane w kwadratowych nawiasach pod identyfikatorem [OCENY].

[STUDENT]

Zakładamy, Ŝe plik jest skonstruowany poprawnie.

Jan

Kowalski

Czytanie z pliku wymaga uŜycia pakietu io (input-output), zadeklaruj więc u góry:

[OCENY]

[7]

import java.io.*;

5 4 5 4 4 3 2

[STUDENT]

W funkcji main wpisz dwie linijki:

Edith

Piaf

FileReader czytacz = new FileReader("C:\\dane.txt");

[OCENY]

BufferedReader buf = new BufferedReader(czytacz);

[3]

4 2 2

Poczekaj chwilę i przeczytaj błąd, który zgłosi NetBeans.

[STUDENT]

Powinno pojawić się: „unreported exception java.io.FileNotFoundException, must be

Tse Tung

caught or declared to be thrown”

Mao

[OCENY]

Konstrukcja łapania wyjątku wygląda podobnie jak w języku C. Przerób funkcję main tak,

[5]

by jej zawartość wyglądała następująco:

2 3 4 5 5

[STUDENT]

try{

Ir Sen

FileReader czytacz = new FileReader("C:\\dane.txt");

Kim

BufferedReader buf = new BufferedReader(czytacz);

[OCENY]

}catch(FileNotFoundException wyjatek){

[4]

System.out.println("Nie znaleziono pliku.");

5 5 5 5

}

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.