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