WSNHiD, Programowanie 2, Lab. 3 Trwałość danych Wyjątki Nietypowe sytuacje, które podczas normalnego wykonywania programu nie powinny się wydarzyć obsługiwane są w języku Java za pomocą wyjątków. Przyjrzyjmy się implementacji poniższej klasy: public class ExceptionsHandling int[] array = new int[3]; array[1] = 1; System.out.println(array[1]); Teraz wprowadźmy niewielką zmianę do implementacji: public class ExceptionsHandling int[] array = new int[3]; array[10] = 1; System.out.println(array[10]); java.lang.arrayindexoutofboundsexception: 10 at ExceptionsHandling.main(ExceptionsHandling.java:6) Exception in thread "main" Zastosowania informatyki, Trwałość danych, 2007 Bartosz Bogacki 1
public class ExceptionsHandling int[] array = new int[3]; array[10] = 1; System.out.println(array[10]); catch (ArrayIndexOutOfBoundsException e) System.out.println("Indeks poza zakresem!"); Indeks poza zakresem! Zapis i odczyt danych do/z pliku W języku Java istnieje kilka sposobów zapisu danych do pliku. Sposoby te są realizowane przez dostarczone klasy z pakietu java.io. Oto przykład: import java.io.filewriter; import java.io.ioexception; public class WriteTest FileWriter fw = new FileWriter ("c:/nazwa_pliku.txt"); fw.write("jakis tekst"); fw.close(); System.out.println("Zapis nieudany"); Zastosowania informatyki, Trwałość danych, 2007 Bartosz Bogacki 2
A tu odczyt danych z pliku: import java.io.bufferedreader; import java.io.filereader; import java.io.ioexception; public class ReadTest FileReader fr = new FileReader ("c:/nazwa_pliku.txt"); BufferedReader bf = new BufferedReader(fr); System.out.println(bf.readLine()); fr.close(); System.out.println("Odczyt nieudany"); Zadanie 1 Proszę napisać klasę Money (pieniądze) implementującą interfejs IMoney. public interface IMoney int getmoney(); void save(); Metoda save() powinna zapisać w pliku dyskowym kwotę przechowywaną przez klasę Money. Zastosowania informatyki, Trwałość danych, 2007 Bartosz Bogacki 3
Serializacja Język Java umożliwia również zapis na dysk w postaci binarnej całych obiektów, które istnieją w pamięci. Aby skorzystać z mechanizmu serializacji klasa musi implementować interfejs Serializable. public class Person implements Serializable private String name; private String surname; public Person(String name, String surname) this.name = name; this.surname = surname; public String getname() return name; public String getsurname() return surname; Proszę utworzyć nową klasę o nazwie MySerializer i dodać do niej metody serialize() oraz deserialize(). private void serialize(object object, String filename) FileOutputStream fos; ObjectOutputStream oos; fos = new FileOutputStream (filename); oos = new ObjectOutputStream (fos); oos.writeobject(object); oos.close(); catch (FileNotFoundException e) Zastosowania informatyki, Trwałość danych, 2007 Bartosz Bogacki 4
private Object deserialize(string filename) FileInputStream fis; ObjectInputStream ois; Object object = null; fis = new FileInputStream (filename); ois = new ObjectInputStream (fis); object = ois.readobject(); ois.close(); catch (FileNotFoundException e) catch (ClassNotFoundException e) return object; Spójrzmy teraz na proste wykorzystanie klasy MySerializer: Person a = new Person("Bartek", "Bogacki"); Person b = new Person("Wojtek", "Complak"); Person x; Person y; MySerializer ms = new MySerializer(); ms.writeobject(a, "c:/temp/person1"); ms.writeobject(b, "c:/temp/person2"); x = (Person)ms.readObject("c:/temp/person1"); y = (Person)ms.readObject("c:/temp/person2"); System.out.println(x.getName() + " " + x.getsurname()); System.out.println(y.getName() + " " + y.getsurname()); Zadanie 2 Proszę napisać klasę Marriage (małżeństwo). Klasa ta powinna implementować interfejs IMarriage: Zastosowania informatyki, Trwałość danych, 2007 Bartosz Bogacki 5
public interface IMarriage Person getwife(); Person gethusband(); Proszę zserializować obiekt Marriage do pliku c:/temp/marriage.serialized a następnie ponownie wczytać dane i utworzyć obiekt za pomocą deserializacji. UWAGA: Aby uniknąć zapisania wartości pewnych pól klasy na dysk podczas serializacji, należy poprzedzić te pola specyfikatorem transient. import java.io.serializable; public class Person implements Serializable private String name; private transient String surname; public Person(String name, String surname) this.name = name; this.surname = surname; public String getname() return name; public String getsurname() return surname; Literatura http://java.sun.com/developer/technicalarticles/programming/serialization/ Thinking in Java. Wydanie 3. Edycja polska - Bruce Eckel Zastosowania informatyki, Trwałość danych, 2007 Bartosz Bogacki 6