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.