Exemple Entrée/Sortie

publicité
Plan du cours

La sérialisation:
– comment stocker et restaurer les Objets?

Les interfaces graphiques et la programmation
évènementielle.
– Comment concevoir les écrans?
– Comment programmer les évènements?
– Comment développer une application en java?

Les Threads ou les processus légers
– Qu’est ce que la programmation parallèle.
– Comment programmer les processus en java

Les Applets : java sur le Web.
– Comment utiliser java pour programmer vos pages.
Exemple Entrée/Sortie
Sérialisation
problématique
La portée de chaque variable est limitée
au bloc de déclaration.
 A la fin de l’application, les variables
(objets) sont détruites par le
GarbageCollector (perte de données).
 Certaines variables ou objets (pour des
raisons applicatives) doivent persister à
la fin du programme.

Exemple: gestion des employés

On veut écrire un programme de saisie
d’employés.
 Solution:
pile
tas
Public static void main(String[] args)
base
{ListPersonel base= new ListPersonel();
Class Employé
ListEmployé
Nom
liste
Prénom
boolean fin=false;
Adress ….
While(!fin)
{// lire les données de l’employé data
base.add(new Employé(data));
Employé[] list
// lire décision de poursuite de l’utilisateur
fin= decision;
}// fin main
}
Employé[]
ListPersonnels
Employé
…..
Add(Employé)
Remove(Employé)
Solution:

Trouver le moyen de persister les données.
 Solution : utiliser un fichier pour stocker les
données:
– Définir un modèle de stockage des Objets
– Définir le moyen de restauration des Objets
– Exemple:
InputStream ou FileWriter
public class MyClass {
public void saveYourself(Writer o) OutputStream ou FileReade
throws IOException { … }
public static MyClass loadYourself(Reader r)
throws IOException { … }
}
Limite de cette solution
Le stockage de l’objet passe par le stockage
de ses données membres.
 Chaque Objet membre doit appartenir à une
classe qui implémente le même mécanisme.
 Impossible de passer par les interfaces (la
méthode de restauration doit être static).
 La solution devient très complexe pour gérer
les références

Problème de reférence
employé1
Employé1
……
employé3
Patron:
Employé3
employé1
……..
employé2
employé3
Employé2
Emp1. saveYourself(Writer……
o)
Emp2. saveYourself(WriterPatron:
o)
Emp2. saveYourself(Writer o)
employé2
Employé3
……..
employé3
Employé3
……..
Emp1=Employé.loadYourself(Reader r)
Emp2=Employé.loadYourself(Reader r)
Emp3=Employé.loadYourself(Reader r)
employé4
employé3
La sérialisation

Le mécanisme offert par Java pour persister les
données.

Un format uniforme pour formater les objets
sous forme d’une séquence d’octets.

Il gère le problème de référence.

Offre d’autres mécanismes de personnalisation
Les Conditions nécessaires
Le type de l’objet (Class) doit être déclaré
public
 La classe doit disposer d’un constructeur à
zéro paramètres
 La classe doit implémenter l’interface
Serialisable
 Toutes les données membre doivent être
« sérialisable »: type primitive ou des classes
qui implémentent Serialisable .

Les données membres static et static final ne
sont pas sauvegardées
Implémentation de l’interface
Serializable

Implémenter une interface induit à
l’implémentation de ses méthodes, Mais…
 Serializable ne définit aucune méthode.
– Question1: A quoi sert une interface sans méthodes?
– Réponse: Serialisable est une interface drapeau qui
informe l’environnement Java pour traiter la Classe
de manière particulière.
– Question2: pourquoi toutes les classes
n’implémentent pas Serializable par défaut ?
– Réponse: problème de sécurité (voire la suite).
Sérialiser un Object
La Classe ObjectOutputStream.
 Elle prend en paramètre un OutputStream
 Utilise la méthode writeObject(Object)

public class employé implements Serializable{………}
………
public class Sauvgarder{
public static void main(){
Employé emp1=new Employé(………);
ObjectOutputStream out=new ObjectOutputStream(
new FileOutputStream(fileName))
out.writeObject(emp1);
Out.close
…………}}
Restaurer un objet (« de-sérialiser »)
Faut savoir à l’avance le type de l’objet.
 Utilisé la classe ObjectInputStream.
ObjectInputStream in=
 Prend
un object InputStream.
new
ObjectInputStream(
new FileInputStream(fileName));
 Utilise
la méthode readObject().
 Type de retour Object.
Employé emp1=((Employé)in.readObject()
 Il faut savoir le type (pour le transtypage).
 Vous pouvez utiliser la méthode.
getClass() pour savoir le type effectif.

Exemple: problème de référence
emp1
employé1
Employé1
employé3
1
employé1
……
employé3
Patron: 2
emp3
employé2
Employé3
2
……..
Patron:null
Employé2
3
……
Patron:
emp2
2
ObjectOutputStream
out=new
ObjectOutputStream(
ObjectInputStream in=new
ObjectOutputStream(
FileOutputStream(fileName))
new FileInputStream(fileName))
out.writeObject(emp1);
emp1= ((Employé)in.readObject());
out.writeObject(emp2);
emp2=
((Employé)in.readObject());// ne crée pas d’objet
out.writeObject(emp3);
emp3= ((Employé)in.readObject());
employé2
Aspects avancés

Sécurité:
– Une objet sérialisé est un fichier UTF(texte).
– Un objet sérialisé peut être lu et modifié.

le mot clé transient
– Certaines données (non static) ne doivent pas être
stockées (les valeurs calculées, mot de passe)
– Le mot clé transient informe java de ne pas sérialiser
la variable en question.
public class Employé implements Serializable {
………………
private transient double salaire;
// le salaire ne sera pas sérialisé}
En résumé:





Désormais, il est possible de sauvegarder les
variables objets.
Implémenter l’interface Serialisable
Utilisez ObjectInputStream &
ObjectOutputStream pour stocker et restaurer
les objets.
Les objets restaurés sont de type Object
(transtypage).
Faites attention lors de l’héritage, les classes
mères doivent avoir des contructeurs à zéro
paramètres……
Les Interfaces graphiques
Les Swing
Les interfaces graphiques:
Introduction
Une application est une boîte noire.
 Prend des entrées et produit des sorties.
 Les utilisateurs ne sont pas des
programmeurs.
 Nécessité d’un mécanisme d’interaction
entre l’utilisateur et l’application:

– Echanger les données.
– Echange de contrôle.
Solution la plus basique:
les Intput/output Stream

Vous pouvez passer par des objets de
gestion de flux ou de données pour interagir
avec l’utilisateur.
 Saisir les données dans un fichier ou à partir
du clavier (System.in, InputStream).
 affichage des résultats sur la console ou dans
des fichiers (System.out et OutputStream).
Inconvénients:
Très lourde (beaucoup de code pour
peut de chose).
 Peu adaptée pour les interactions de
type contrôle.
 Pas du tout intuitive: il faut connaître
pour pouvoir l’utiliser
 certains types de données ne peuvent
être gérés en tant que flux.

Solution : Les interfaces graphiques
Faire une interface graphique...

Comment construire un écran
graphique ?

Comment gérer les événements ?

Comment maintenir la cohérence entre
les objets applicatifs / objets graphiques
?
Définition des écrans !





Une application = plein d ’écrans graphiques
Un écran graphique = 1 arbre de composants
graphiques
La racine = La fenêtre
Les feuilles = des composants atomiques
(button, List, TextField…)
Les nœuds = des conteneurs (des zones pour
mettre des composants atomiques)
Exemple: très simple
fenêtre :Frame
Caption: Label
Bouton de commande: Button
Zone de texte:TextField
Exemple : un arbre de composant
graphique
Racine est écran
Les nœuds des
saisir:
Frame
containeurs
?????
nom :
Label
ajout :
Buttonl
post:
TextField
Les feuilles composants
atomiques
Étape1: Comment construire des
écrans Graphiques ?

Java offre une « pléthora » de composantes
graphiques.
 Deux packages java.awt.*; javax.swing.*;
 Le package swing est une extension de awt
 On peut les classer selon trois catégories
– Les composantes écrans
– Les composantes de gestion d’emplacement: les
containers
– Les composantes graphiques atomiques.
– Les composantes de type menus.
Une vue partielle sur le modèle
de classe du package swing
Les
composants
atomiques
JButton
Une classe abstraite!
JComponent
(from awt)
component[]
Container
TextComponent
(from awt)
Les composants
composites !
(from awt)
(from awt)
JTextField
JWindow
Panel
(from awt)
JList
JFrame
Pas de nouvelles
fenêtres
La classe JFrame

La classe qui permet de créer des fenêtres
 C’est l’objet racine
 Sous classe de la classe Frame de awt.
 Elle maintient un objet de gestion de
composants.
Frame
(awt)
« Interface »
WindowConstants
JFrame
JRootPane
« Interface »
RootPaneContainer
Les constructeurs de JFrame

Deux constructeurs:
1.
2.

public JFrame()
public JFrame(String titre)
Exemple:
public static void main(String[] args)
{
//mode d’affichage par défaut (mode java)
JFrame.setDefaultLookAndFeelDecorated(true);
Jframe e= new JFrame(« Ecran de saisie Employé");
e.setSize(300,40);//spécification de la taille
e. show();
//affiche la composante de type écran en mode java
}
Largeur=300
Hauteur=40
Téléchargement