Les entrées/sorties Java (sérialisation, accès aux chiers et connexion réseau)



Documents pareils
Développement Logiciel

Flux de données Lecture/Ecriture Fichiers

Cours 14 Les fichiers

Entrées / Sorties. Entrées / Sorties. Entrées/Sorties. System.out. Fonctionnement par flots (stream) Karima Boudaoud IUT- R&T. Terrain connu.

Programmation Orientée Objet - Licence TIS CM8/9. Rappel sur la séance précédente. Lancelot Pecquet Lancelot.Pecquet@math.univ-poitiers.

Programmation Réseau. Sécurité Java. UFR Informatique jeudi 4 avril 13

Gestion distribuée (par sockets) de banque en Java

Programmer en JAVA. par Tama

Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

Compte-rendu de projet de Système de gestion de base de données

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

RMI le langage Java XII-1 JMF

Auto-évaluation Programmation en Java

RMI. Remote Method Invocation: permet d'invoquer des méthodes d'objets distants.

Exceptions. 1 Entrées/sorties. Objectif. Manipuler les exceptions ;

TP1 : Initiation à Java et Eclipse

Java RMI. Arnaud Labourel Courriel: Université de Provence. 8 mars 2011

Java DataBaseConnectivity

Premiers Pas en Programmation Objet : les Classes et les Objets

Encapsulation. L'encapsulation consiste à rendre les membres d'un objet plus ou moins visibles pour les autres objets.

Java Licence Professionnelle Cours 7 : Classes et méthodes abstraites

Héritage presque multiple en Java (1/2)

Programmation Objet Java Correction

Info0604 Programmation multi-threadée. Cours 5. Programmation multi-threadée en Java

Cours 1 : Introduction. Langages objets. but du module. contrôle des connaissances. Pourquoi Java? présentation du module. Présentation de Java

Cours intensif Java. 1er cours: de C à Java. Enrica DUCHI LIAFA, Paris 7. Septembre Enrica.Duchi@liafa.jussieu.fr

Langage Java. Classe de première SI

Synchro et Threads Java TM

Généralités sur le Langage Java et éléments syntaxiques.

IFT287 Exploitation de base de données relationnelles et orientées objet. Laboratoire Mon premier programme Java en Eclipse

Projet gestion d'objets dupliqués

Projet de programmation (IK3) : TP n 1 Correction

Programmation Orientée Objet

Chapitre VI- La validation de la composition.

Cours 1: Java et les objets

P r ob lé m a t iq u e d e la g é n é r icit é. Pr in cip e d e la g é n é r icit é e n Ja v a ( 1 /3 )

Serveur d'archivage 2007 Installation et utilisation de la BD exist

Page 1 sur 5 TP3. Thèmes du TP : l la classe Object. l Vector<T> l tutorial Interfaces. l Stack<T>

Cours 6 : Tubes anonymes et nommés

Corrigé des exercices sur les références

Remote Method Invocation (RMI)

Traitement de données

INITIATION AU LANGAGE JAVA

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

TP Composants Java ME - Java EE. Le serveur GereCompteBancaireServlet

Exercices INF5171 : série #3 (Automne 2012)

Remote Method Invocation Les classes implémentant Serializable

Diagramme de classes

Quelques patterns pour la persistance des objets avec DAO DAO. Principe de base. Utilité des DTOs. Le modèle de conception DTO (Data Transfer Object)

Tutorial sur SQL Server 2000

TD3: tableaux avancées, première classe et chaînes

Programmation Objet - Cours II

Introduction à JDBC. Accès aux bases de données en Java

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Chapitre 2. Classes et objets

TP, première séquence d exercices.

Apprendre Java en 154 minutes

Chapitre 10. Les interfaces Comparable et Comparator 1

TD Objets distribués n 3 : Windows XP et Visual Studio.NET. Introduction à.net Remoting

Application web de gestion de comptes en banques

Le stockage local de données en HTML5

Utilisation d objets : String et ArrayList

J2SE Threads, 1ère partie Principe Cycle de vie Création Synchronisation

C++ COURS N 2 : CLASSES, DONNÉES ET FONCTIONS MEMBRES Classes et objets en C++ Membres d'une classe Spécification d'une classe Codage du comportement

Structure d un programme et Compilation Notions de classe et d objet Syntaxe

SYSTÈME DE GESTION DE FICHIERS

Chapitre I Notions de base et outils de travail

Plan du cours. Historique du langage Nouveautés de Java 7

SYSTÈME DE GESTION DE FICHIERS SGF - DISQUE

Environnements de développement (intégrés)

PROGRAMMATION PAR OBJETS

Programmation Internet en Java

INF2015 Développement de logiciels dans un environnement Agile. Examen intra 20 février :30 à 20:30

Java Licence Professionnelle CISII,

Acronis Backup & Recovery 10 Advanced Server Virtual Edition. Guide de démarrage rapide

SHERLOCK 7. Version du 01/09/09 JAVASCRIPT 1.5

Une introduction à Java

SweetyPix, mode d'emploi

Pour plus de détails concernant le protocole TCP conférez vous à la présentation des protocoles Internet enseignée pendant.

Architecture Orientée Service, JSON et API REST

Classe ClInfoCGI. Fonctions membres principales. Gestion des erreurs

Dis papa, c est quoi un bus logiciel réparti?

Traduction des Langages : Le Compilateur Micro Java

et se trouve popularisé rapidement pour ses possibilités de développement liés au Web. Les

Guide de configuration de SQL Server pour BusinessObjects Planning

Projet de Veille Technologique

Threads. Threads. USTL routier 1

ACTIVITÉ DE PROGRAMMATION

Polymorphisme, la classe Object, les package et la visibilité en Java... 1

Langage et Concepts de Programmation Objet. 1 Attributs et Méthodes d instance ou de classe. Travaux Dirigés no2

Télécom Nancy Année

Un ordonnanceur stupide

Tp 1 correction. Structures de données (IF2)

TP : Shell Scripts. 1 Remarque générale. 2 Mise en jambe. 3 Avec des si. Systèmes et scripts

Propagation sur réseau statique et dynamique

2 Grad Info Soir Langage C++ Juin Projet BANQUE

Calcul Parallèle. Cours 5 - JAVA RMI

Initiation à JAVA et à la programmation objet.

Réseau : Interconnexion de réseaux, routage et application de règles de filtrage.

Communication inter-processus (IPC) : tubes & sockets. exemples en C et en Java. F. Butelle

Transcription:

Année 2008-2009 Les entrées/sorties Java (sérialisation, accès aux chiers et connexion réseau) Nicolas Baudru mél : nicolas.baudru@esil.univmed.fr page web : nicolas.baudru.perso.esil.univmed.fr 1

Introduction Lors de la conception d'un logiciel, il n'est pas rare de vouloir lire ou écrire dans un chier (par ex., pour sauvegarder des données), ou bien se connecter à un serveur. Indépendamment de la méthode employée, vous utiliserez des techniques d'entrées/sorties (E/S ou I/O en anglais) qui sont pratiquement toujours les mêmes : on écrit ou on lit des données sur/via un support quelconque (généralement un chier ou une connexion réseau). Dans ce cours nous allons étudier ces techniques d'e/s via trois cas d'utilisation : la sérialisation la lecture ou l'écriture de/dans des chiers les connexions réseaux A chaque fois, il nous faudra utiliser des ots d'e/s. 2

Le concept de ots L'API d'e/s Java comprend deux types de ots : les ots de communication, qui représentent des destinations et des sources telles que des chiers ou des sockets réseau les ots de traitement qui ne fonctionnent que s'ils sont chaînés à d'autres ots. En général, il est nécessaire de chaîner au moins deux ots : l'un pour représenter la connexion et l'autre pour les appels de méthodes. Exemple : FileOutputStream (voir plus loin) a des méthodes pour écrire des octets dans un chier. Mais comme nous voulons écrire des objets, il faut un ot de traitement de plus haut niveau. La possibilité de mélanger diérentes combinaisons de ots de communication et de traitement procure une très grande souplesse et permet de personnaliser l'utilisation de ces chaînages. 3

La sérialisation Supposons que vous écrivez un jeu (le jeu du zoo par exemple), et que vous souhaitez enregistrer l'état de votre jeu, pour le restaurer plus tard. Deux méthodes (au moins) sont disponibles : interroger chaque objet, puis enregistrer la valeur de leurs variables d'instance dans un chier que vous créez. Cette méthode est laborieuse mais le chier produit est lisible par l'homme et peut donc être lu par d'autres applications non-java. ou le faire à la OO, c'est-à-dire en sérialisant les objets à sauvegarder. Cette méthode est plus ecace et plus adaptée au concept objet, mais le résultat est un chier qui n'a aucun sens pour l'homme. Il est cependant beaucoup plus facile et sûr pour votre programme de restaurer les chiers issus de la sérialisation plutôt que des chiers textes. 4

Écrire un objet sérialisé dans un chier 1 Créer un FileOutputStream. Cet objet sait comment se connecter à un chier et même en créer un. FileOutputStream fos = new FileOutputStream (" MonZoo. ser " ); 2 Créer un ObjectOutputStream. Cet objet permet d'écrire des objets, mais il ne peut pas se connecter directement à un chier. Il a besoin pour cela d'un intermédiaire, ici un FileOutputStream. On va alors chaîner les deux ots, le ObjectOutputStream au FileOutputStream. ObjectOuputStream oos = new ObjectOutputStream ( fos ); 3 Écrire les objets à sauvegarder dans MonZoo.ser. oos. writeobject ( monchien ); oos. writeobject ( moncanard ); 4 Fermer ObjectOutputStream. La fermeture du premier ot entraîne automatiquement celle des autres. oos. close (); 5

Écrire un objet sérialisé dans un chier Objet est écrit dans ObjectOutputStream l'objet est sérialisé chaîné à transformé en octets et écrit dans 0010110011010010100 FileOutputStream 00101100 11010010 100 Fichier 6

Qu'est-ce qu'un objet sérialisé? Les objets sur le tas ont un état. Cet état est représenté par la valeur de ses variables d'instance. Ce sont ces valeurs qui diérencient deux instances d'une même classe. La sérialisation sauvegarde la valeur des variables d'instance dans un chier, ainsi que quelques informations indispensables à la JVM pour restaurer l'objet (comme par exemple son type). Si les variables d'instance de l'objet sont de type primitif, alors la sauvegarde est simple. Mais que doit-on sauvegarder si certaines variables d'instance sont des références? En fait, dans ce dernier cas, il faut aussi sérialiser tous les objets référencés. Et tous les objets que ces objets référencent doivent l'être aussi. Et ainsi de suite... Heureusement, tout ceci s'eectue de manière automatique par la JVM... 7

Que peut-on sérialiser? Si vous voulez qu'une classe soit sérialisable, il faut qu'elle implémente l'interface Serialisable. Cette interface est dite de type marqueur car elle n'a aucune méthode à implémenter. Son seul rôle est d'annoncer à la JVM qu'elle est sérialisable. Si une classe est marquée sérialisable, toutes ses sous-classes le sont aussi par héritage. Pour pouvoir sérialiser un objet, il faut que tout objet référencé par l'une des variables d'instance de cet objet soit aussi sérialisable, et ainsi de suite. Si une variable d'instance ne peut pas être sauvegardée parce qu'elle n'est pas sérialisable, vous pouvez la déclarer transient. Dans ce cas le processus de sérialisation ignorera complètement cette variable. Pourquoi une variable ne serait-elle pas sérialisable? 8

Que peut-on sérialiser? Exemple import java. io.*; // Serialisable est dans ce package. public class Canin implements Serialisable { } public class Loup extends Canin { } public class Chien { } public class Coq { } public class BasseCour implement Serialisable { Coq c = new coq ; } public class Chenil implements Serialisable { transient Chien c = new Chien (); } Quels sont les objets sérialisables? 9

Questions Pourquoi toutes les classes ne sont-elles pas sérialisables? Que devient une variable transient lors de la restauration d'un objet? Que se passe-t-il si plusieurs variables pointent sur un même objet? Que signie avoir une sous-classe sérialisable alors que sa superclasse ne l'est pas? 10

La désérialisation Tout l'intérêt de sauvegarder un objet est de pouvoir le restaurer le moment venu. Le processus de désérialisation est très similaire à celui de la sérialisation : 1 Chaîner un FileInputStream et un ObjectInputStream FileInputStream fis = new FileInputStream (" MonZoo. ser " ); ObjectInputStream ois = new ObjectInputStream ( fis ); 2 A chaque invocation de readobject, l'objet suivant est récupéré. Object un = ois. readobject (); Object deux = ois. readobject (); 3 Convertir les objets. Loup monloup = ( Loup ) un ; 4 Fermer les ots. ois. close (); 11

Le processus de désérialisation 1 L'objet est lu dans le ot. 2 La JVM détermine le type de l'objet et essaie de charger la classe de l'objet (elle lance une exception en cas d'échec). 3 Elle alloue au nouvel objet de l'espace sur le tas, mais n'appelle pas le construcuteur de l'objet sérialisé. 4 Si l'objet a une classe non-sérialisable quelque part dans son arbre généalogique, le constructeur de cette classe non-sérialisable s'éxécute (et donc tous les constructeurs des superclasses de cette classe non-sérialisable). Ainsi toutes les superclasses, à partir de la première non-sérialisable, vont réinitialiser leur état. 5 Les variables d'instance reçoivent les valeurs de l'état sérialisé. Les variables temporaires reçoivent null pour les références et la valeur par défaut pour les types primitifs. Les variables transient sont réinitialisées par un appel du constructeur adéquat. Les variables statiques12sont-elles sérialisées?

Numéro de version et désérialisation Que se passerait-il si une classe était modiée avant la désérialisation? Modications pouvant empêcher la désérialisation : Supprimer une variable d'instance,... Et quoi d'autres? Modication sans problème : Ajouter de nouvelles variables d'instance à la classe,... Et quoi d'autres? Heureusement Java met en oeuvre un mécanisme d'estampillage de l'objet sérialisé par un numéro de version (serialversionid) an de détecter tout changement. 13

Ecrire du texte dans un chier Ecrire du texte (des données de type String) dans un chier est similaire à l'écriture d'un objet sérialisé, sauf que l'on veut écrire des chaînes de caractères et non pas des octets dans le chier. Pour réaliser cela, il sut d'utiliser un FileWriter plutôt qu'un FileOuputStream. Puisque les chaînes de caractères vont être écrites tel quel, il n'est pas nécessaire d'utiliser un ot de traitement comme ObjectOuputStream. import java. io.*; // ce package contient FileWriter class EcrireTexte { public static void main ( String [] args ) { try { // tout le code E/ S doit être dans un try / catch FileWriter fw = new FileWriter (" MonFic. txt " ); // si ce fichier n ' existe pas, il sera créé fw. write (" bonjour " ); fw. close (); // Ferme le flot } catch ( IOException ex ) { ex. printstacktrace ();} } } 14

La classe Java.io.File Cette classe représente un chier sur le disque, mais pas son contenu. Un objet File peut être vu comme le nom de chemin d'un chier ou d'un répertoire. Un objet File n'a donc pas de méthodes de lecture ou d'écriture, mais il possède une propriété très utile : il permet de représenter un chier de façon beaucoup plus sûre qu'un String. De plus vous pouvez par exemple vérier que le chemin est valide avant de le transmettre comme argument à une autre méthode. La plupart des classes de ots de données dont le constructeur accepte un String accepte aussi un objet de type File (ex. FileWriter, FileInputSream,...). 15

Exemple d'utilisation de File Créer un objet représentant un chier existant : File f = new File (" MonFic. txt " ); Créer un répertoire : File rep = new File (" MonRep " ); rep. mkdir (); Lister le contenu d'un répertoire : if ( rep. isdirectory ()) { String [] contenurep = rep. list (); for ( int i = 0; i < contenurep. length ; i ++) { System. out. println ( contenurep [i ]); } } Obtenir le chemin absolu d'un chier ou d'un répertoire : System. out. println ( rep. getabsolutepath ()); Supprimer un chier ou un répertoire : boolean supprime = f. delete (); 16

Les buers Les buers fournissent un contenant temporaire pour grouper les données jusqu'à ce qu'il soit plein. De cette façon, vous pouvez limiter le nombre d'accès au disque dur (qui prennent beaucoup de temps). "Marseille" String est écrit dans "Marseille" "Paris" "Lille" BufferedWriter chaîné dans "Marseille Paris Lille" FileWriter Lille Paris Marseille MonFic.txt Exemple : FileWriter fw = new FileWriter (" monfic. txt " ); BufferedWriter bw = new BufferedWriter ( fw ); Dans cet exemple les données seront écrites sur le disque lorsque le buer sera plein. En eet, ce dernier transfèrera alors toutes ses données au FileWriter qui écrira toutes les données sur le disque en une seule fois. Si vous voulez envoyer les données avant que le buer soit plein, il sut de le vider par un appel de bw.ush(). 17

Lire du texte dans un chier import java. io.*; // A ne pas oublier class LireFichier { public static void main ( String [] args ) { try { File f = new File (" MonFic. txt " ); FileReader fr = new FileReader ( f ); // Flot de communication pour les caractères, // qui se connecte à un fichier BufferedReader br = new BufferedReader ( fr ); // Flot de traitement pour les caractères ( buffer ). // Ce flot est chaîné au FileReader String ligne = null ; // contiendra chaque ligne while (( ligne = br. readline ())!= null ) { System. out. println ( ligne ); } br. close (); } catch ( IOException ex ) { ex. printstacktrace ();} } } 18