1. Treści programowe:
Sezializacja, strumienie we/wy, operator transient, wyjściowe i wejściowe strumienie
obiektowe, plik, interfejs Serializable.
2. Cel zajęć:
Opanowanie umiejętności serializacji obiektów w
aplikacji java. Poznanie mechanizmów pozwalających
przechowywanie obiektów w pliku na dysku komputera.
3. Materiały dydaktyczne
Interfejs Serializable nie
posiada metod abstrakcyjnych.
Program zapisujący obiekt klasy Dane do pliku:
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
public class ZapiszObiektDoPliku {
public static void main(String[] args) {
Dane dane = new Dane("Jan", "Kowalski", 22);
try {
FileOutputStream fileOutputStream = new FileOutputStream("dane.dat");
ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);
objectOutputStream.writeObject(dane);
objectOutputStream.close();
System.out.println("Dane zapisane.");
} catch (IOException e) {
System.out.println("Nie można zapisać pliku.");
}
}}
Program odczytujący obiekt klasy Dane z pliku:
import java.io.FileInputStream;
import java.io.ObjectInputStream;
public class OdczytajObiektZPliku {
public static void main(String[] args) {
try {
FileInputStream fileInputStream = new FileInputStream("dane.dat");
ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);
Dane dane = (Dane) objectInputStream.readObject();
objectInputStream.close();
System.out.println(dane.toString());
} catch (Exception e) {
System.out.println("Nie można pobrać danych z pliku.");
}
}}
Klasa Dane:
import java.io.Serializable;
// interfejs Serializable
jest wymagany aby można było zapisać instancję tej klasy
public class Dane implements Serializable {
private String imie;
private String nazwisko;
private int wiek;
public Dane(String imie, String nazwisko, int wiek) {
this.imie = imie;
this.nazwisko = nazwisko;
this.wiek = wiek;
}
public String getImie() {
return
imie;
}
public void setImie(String imie) {
this.imie = imie;
}
public String getNazwisko() {
return
nazwisko;
}
public void setNazwisko(String nazwisko) {
this.nazwisko = nazwisko;
}
public int getWiek() {
return
wiek;
}
public void setWiek(int wiek) {
this.wiek = wiek;
}
@Override
public String toString() {
return
"Dane{" +
"imie='" + imie + '\'' +
", nazwisko='" + nazwisko + '\'' +
", wiek=" + wiek +
'}';
}
}
------------------------------------------------------------------------------------------------
Przykład programu zapisującego listę obiektów do
pliku:
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.List;
public class ZapiszObiektDoPliku {
public static void main(String[] args) {
List<Dane> dane = new ArrayList<>();
dane.add(new Dane("Jan", "Kowalski", 22));
dane.add(new Dane("Piotr", "Nowak", 32));
dane.add(new Dane("Joanna", "Kowal", 19));
try {
FileOutputStream fileOutputStream = new FileOutputStream("dane.dat");
ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);
objectOutputStream.writeObject(dane);
objectOutputStream.close();
System.out.println("Dane zapisane.");
} catch (IOException e) {
System.out.println("Nie można zapisać pliku.");
}
}}
Przykład programu odczytującego listę obiektów z
pliku:
import java.io.FileInputStream;
import java.io.ObjectInputStream;
import java.util.ArrayList;
import java.util.List;
public class OdczytajObiektZPliku {
public static void main(String[] args) {
List<Dane> dane;
try {
FileInputStream fileInputStream = new FileInputStream("dane.dat");
ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);
dane = (ArrayList) objectInputStream.readObject();
objectInputStream.close();
for(Dane obiekt : dane){
obiekt.toString();
}
System.out.println(dane.toString());
} catch (Exception e) {
System.out.println("Nie można pobrać danych z pliku.");
}
}}
-------------------------------------------------------------------------------------------------------------------------------------
Przykład aplikacji wykorzystującej serializację
obiektów pokazanej w trybie graficznym:
Klasa Linia.java:
import java.io.Serializable;
class Linia implements Serializable {
int x,y,xx,yy;
Linia(int x_, int y_, int xx_, int yy_){
x=x_;
y=y_;
xx=xx_;
yy=yy_;
}
}
Klasa PanelGraf.java:
import java.util.*;
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
import java.util.List;
class PanelGraf extends JPanel implements MouseListener, MouseMotionListener{
List<Linia> linie;
int x,y,xx,yy;
PanelGraf(){
linie = new ArrayList<>();
addMouseListener(this);
addMouseMotionListener(this);
}
public void paintComponent(Graphics g){
Graphics2D g2D = (Graphics2D)g;
g2D.setColor(getBackground());
g2D.fillRect(0,0,getSize().width, getSize().height);
for(Linia linia: linie){
BasicStroke pen = new BasicStroke(10,1,1);
g2D.setStroke(pen);
g2D.setColor(Color.blue);
g2D.drawLine(linia.x,linia.y,linia.xx,linia.yy);
xx=x;
yy=y;
}
}public void mousePressed (MouseEvent e){
x=e.getX();
y=e.getY();
xx=x;
yy=y;
Linia linia = new Linia(x,y,xx,yy);
linie.add(linia);
repaint();
}
public void mouseExited (MouseEvent e){}
public void mouseEntered (MouseEvent e){}
public void mouseReleased( MouseEvent e){}
public void mouseClicked (MouseEvent e){}
public void mouseDragged (MouseEvent e){
x=e.getX();
y=e.getY();
Linia linia = new Linia(x,y,xx,yy);
linie.add(linia);
repaint();
}
public void mouseMoved (MouseEvent e){}
}
Klasa AplikacjaPaint.java:
import java.io.*;
import java.util.*;
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
public class AplikacjaPaint extends JFrame implements ActionListener{
PanelGraf panelGraf;
JPanel panel;
JToolBar pasek;
JButton bNew, bSave, bOpen;
File file;
AplikacjaPaint(){
super("Aplikacja 1");
setSize(500,400);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
pasek=new JToolBar();
panel = new JPanel(new BorderLayout());
bNew = new JButton(new ImageIcon(getClass().getClassLoader().getResource("new.png")));
bSave = new JButton(new ImageIcon(getClass().getClassLoader().getResource("save.png")));
bOpen = new JButton(new ImageIcon(getClass().getClassLoader().getResource("open.png")));
pasek.add(bNew);
pasek.add(bSave);
pasek.add(bOpen);
panelGraf = new PanelGraf();
panel.add("North",pasek);
panel.add("Center", panelGraf);
setContentPane(panel);
bNew.addActionListener(this);
bSave.addActionListener(this);
bOpen.addActionListener(this);
setVisible(true);
}
public void open(){
try{
JFileChooser fc = new JFileChooser();
int returnVal = fc.showOpenDialog(null);
if (returnVal == JFileChooser.APPROVE_OPTION) {
file = fc.getSelectedFile();
FileInputStream plik = new FileInputStream (file);
ObjectInputStream ob = new ObjectInputStream (plik);
panelGraf.linie =(ArrayList)ob.readObject();
panelGraf.repaint();
ob.close();
System.out.println("Dane odczytane");
}
}catch (Exception e){
System.out.println("Blad przy otwieraniu pliku");
}
} public void save(){
try{
JFileChooser fc = new JFileChooser();
int returnVal = fc.showSaveDialog(null);
if (returnVal == JFileChooser.APPROVE_OPTION) {
file = fc.getSelectedFile();
//-------------- Serializacja ----------------------------
FileOutputStream plik = new FileOutputStream(file);
ObjectOutputStream ob = new ObjectOutputStream (plik);
ob.writeObject(panelGraf.linie);
ob.close();
System.out.println("Dane zapisane ");
}
}catch (IOException e){
System.out.println("Blad przy zapisywaniu pliku");
}
} public void newVector(){
panelGraf.linie = new ArrayList<>();
panelGraf.repaint();
}
public void actionPerformed(ActionEvent ee){
Object o = ee.getSource();
if(o==bSave)
save();
elseif(o==bOpen)
open();
elseif(o==bNew)
newVector();
}
static public void main (String arg[]){
new AplikacjaPaint();
}
}

4. Zadania
Zadanie 1.
Napisz program wykorzystujący mechanizm serializacji. Zapisz i odczytaj
do/z pliku listę obiektów. Wykorzystaj interfejs graficzny Swing.