Obraz zawierający tekst, Czcionka, Grafika

Opis wygenerowany automatycznie 

Kierunek Informatyka

 

Instrukcja do ćwiczeń laboratoryjnych nr:

13

Nazwa przedmiotu:
Programowanie w języku Java

Temat: Serializacja obiektów

Tryb studiów: stacjonarne

Czas trwanie ćw.

2x45 min

Autor materiałów: dr Marcin Skuba

 

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();
        else
        if(o==bOpen)
            open();
        else
        if(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.