JAVA Les Entrées-sorties
Entrées-sorties en Java java.io 3 hiérarchies de classes Input : sous-classes de InputStream : read() Output : sous-classes de OutputStream : write() RandomAccessFile on les combine pour obtenir des fonctions différences entre Java 1.0 et 1.1 java.lang.System public static InputStream in public static PrintStream out public static PrintStream err
java.io 1.0
Lecture au clavier : InputStream import java.io.*; public class Echo { public static void main(String[] args) { String s ; byte tab[] = new byte[128]; try { System.in.read(tab); // InputStream lit seulement des octets s = new String(tab, 0); // Conversion en String System.out.println(s); } catch(IOException e) { // Obligatoire pour compiler e.printStackTrace(); D:\Java\Programmes\EchoV0>java Echo essai de inputStream D:\Java\Programmes\EchoV0>
La classe InputStream
Lecture au clavier avec DataInputStream import java.io.*; public class Echo { public static void main (String argv[]) { DataInputStream in = new DataInputStream (System.in); String s ; try { s = in.readLine(); // Lecture d’une ligne System.out.println(s); // Affichage de la ligne lue } catch (IOException e) { e.printStackTrace (); D:\Java\Programmes\EchoV1>java Echo essai de DataInputStream D:\Java\Programmes\EchoV1>
Lecture au clavier Lecture au clavier de plusieurs lignes while (( s=in.readLine()).length () != 0 ) System.out.println(s); Faire moins d’accès : passer par un Buffer DataInputStream in = new DataInputStream ( new BufferedInputStream(System.in));
Ecriture formatée dans un fichier import java.io.*; public class Sortie { public static void main (String argv[]) { try { DataOutputStream out = new DataOutputStream ( new BufferedOutputStream( new FileOutputStream ("Data.txt"))); out.writeBytes ("Essai de DataOutputStream\n"); out.writeDouble (3.14159); out.close(); } catch (IOException e) { e.printStackTrace (); => le fichier binaire Essai.dat est crée (non lisible)
La classe FileOutputStream
Lecture formatée dans un fichier import java.io.*; public class Entree { public static void main (String argv[]) { try { DataInputStream in = new DataInputStream ( new BufferedInputStream( new FileInputStream ("Essai.dat"))); System.out.println (in.readLine()); System.out.println (in.readDouble()); } catch (IOException e) { e.printStackTrace ();
La classe FileInputStream
La classe File noms de fichiers informations créer des dossiers renommer des fichiers
Tester l’existence d’un fichier import java.io.*; public class TestFile { public static void main (String argv[]) { File f = new File ("Infos.txt"); if (f.exists()) System.out.println ("Le fichier Infos.txt existe"); else System.out.println ("Le fichier Infos.txt n'existe pas"); }
Informations sur les fichiers import java.io.*; public class InfosFile { public static void main (String argv[]) { File f = new File ("Infos.txt"); if (f.exists()) { System.out.println ("Informations sur le fichier Infos.txt"); System.out.println ("isFile : " + f.isFile()); System.out.println ("isDirectory : " + f.isDirectory()); System.out.println ("getAbsolutePath : " + f.getAbsolutePath()); System.out.println ("length : " + f.length()); System.out.println ("canRead : " + f.canRead()); System.out.println ("canWrite : " + f.canWrite()); }
Informations sur les fichiers D:\Martin\Java\Programmes\TestFile>java InfosFile Informations sur le fichier Infos.txt isFile : true isDirectory : false getAbsolutePath : D:\Java\Programmes\TestFile\Infos.txt length : 14 canRead : true canWrite : true
La classe AWT.FileDialog import java.io.*; import java.awt.* ; public class TesterFileDialog { public static void main (String argv[]) { Frame maFenetre = new Frame ("Fenêtre indépendante"); maFenetre.setSize(200, 200); maFenetre.show(); FileDialog f = new FileDialog(maFenetre, "Ouvrir un fichier", FileDialog.LOAD); f.show(); String Nom = f.getFile(); String Dir = f.getDirectory(); System.out.println ("Dossier: " + Dir ); System.out.println ("Nom: " + Nom); } D:\Java\Programmes\FileDialog>java TesterFileDialog Dossier: D:\Java\Programmes\FileDialog\ Nom: TesterFileDialog.java
Exécution FileDialog D:\Java\Programmes\FileDialog>java TesterFileDialog Dossier: D:\Java\Programmes\FileDialog\ Nom: TesterFileDialog.java
La classe RandomAccessFile import java.io.*; public class Raf { public static void main (String argv[]) { try { // Ecriture avec accès séquentiel RandomAccessFile f = new RandomAccessFile ("chiffres.dat", "rw"); for (int i = 0; i < 10 ; i ++ ) f.writeInt (i); f.close (); // Ecriture avec accès direct RandomAccessFile f2 = new RandomAccessFile ("chiffres.dat","rw"); f2.seek (5*4); f2.writeInt (0); f2.close (); ...
La classe RandomAccessFile ... // Lecture avec accès séquentiel RandomAccessFile f3 = new RandomAccessFile ("chiffres.dat", "r"); for (int i = 0; i < 10 ; i ++ ) System.out.println ("Valeur " + i + " : " + f3.readInt()); f3.close (); } catch (IOException e) { e.printStackTrace (); EXECUTION : Valeur 0 : 0 Valeur 1 : 1 Valeur 2 : 2 Valeur 3 : 3 Valeur 4 : 4 Valeur 5 : 0 Valeur 6 : 6 Valeur 7 : 7 Valeur 8 : 8 Valeur 9 : 9
La classe RandomAccessFile
La classe RandomAccessFile
La classe StreamTokenizer Découper un InputStream en token On peut définir des séparateurs blancs, ponctuations
La classe StringTokenizer Découpe une String en mots. Les séparateurs ne peuvent pas être définis tabulation, espace, newline
Java.io du JDK 1.1 Class Reader Writer : supportent l’Unicode Dans certains cas on est obligé d'utiliser 1.0 Compression : Zip et GZIP Redirection : System.setIn (InputStream) System.setOut (PrintStream) System.setErr (PrintStream) Sérialisation d'objets
Contenu de java.io version 1.1
Sérialisation d’objets Tout objet implémentant l'interface Serializable peut être transformé en une suite d'octets Ces octets peuvent être stockés ou transmis L’objet peut être reconstruit à partir de ces octets Nécéssaire pour RMI et JavaBeans
Sérialisation d’objets Ecriture : créer un OutputStream le wrapper dans un ObjectOutputStream appeler writeObject() Lecture : créer un InputStream le wrapper dans un ObjectInputStream appeler readObject() rend une référence sur un object : faire un cast Des classes prédéfinies sont sérialisables
Sérialisation d’objets : exemple import java.io.*; class Personne implements Serializable { String nom, prenom ; Personne (String nom, String prenom) { this.nom = nom ; this.prenom = prenom ; } public String toString() { return (nom + " ," + prenom); public static void main (String argv[]) { try { // Enregistrement ObjectOutputStream out = new ObjectOutputStream( new FileOutputStream ("personnes.dat")); out.writeObject ("Sauvegarde d'une personne"); out.writeObject (new Personne ("Aubert", "Jean")); out.close(); ...
Sérialisation d’objets : exemple // Lecture ObjectInputStream in = new ObjectInputStream( new FileInputStream ("personnes.dat")); String s = (String) in.readObject (); System.out.println (s); Personne p = (Personne) in.readObject (); System.out.println (p); in.close(); } catch (Exception e) { e.printStackTrace (); D:\Martin\Java\Programmes\Serialisation>java Personne Sauvegarde d'une personne Aubert ,Jean D:\Martin\Java\Programmes\Serialisation>
Sérialisation La sérialisation considère aussi les références contenues dans l’objet et sérialise les objets correspondants Utile pour les tableaux, listes chaînées...
Sérialisation : exemple import java.io.*; class Compte implements Serializable { Personne client ; int numero ; double solde ; Compte (String nom, String prenom, int numero, double solde) { client=new Personne (nom, prenom); this.numero = numero ; this.solde = solde ; } public String toString() { return (" compte no " + numero + " - solde " + solde + " - client : " + client); public static void main (String argv[]) { try { // Enregistrement ObjectOutputStream out = new ObjectOutputStream( new FileOutputStream ("comptes.dat")); out.writeObject ("Sauvegarde d'un compte"); out.writeObject (new Compte ("Aubert", "Jean", 78, 1598.50)); out.close(); ...
Sérialisation : exemple ... // Lecture ObjectInputStream in = new ObjectInputStream( new FileInputStream ("comptes.dat")); String s = (String) in.readObject (); System.out.println (s); Compte c = (Compte) in.readObject (); System.out.println (c); in.close(); } catch (Exception e) { e.printStackTrace (); EXECUTION : D:\Java\Programmes\Serialisation>java Compte Sauvegarde d'un compte compte no 78 - solde 1598.5 - client : Aubert ,Jean D:\Java\Programmes\Serialisation>
BASES DE DONNEES java.sql
1) Créer la base de données
2) Configurer la source de données dans le driver ODBC
3) Exécution : interrogation de la base de données
En Java : 4 étapes Charger un driver JDBC classe DriverManager Créer une connexion avec la base de données classe Connection Soumettre une requête SQL classe Statement Récupérer les résultats classe ResultSet
Programme Java (1) //------------------------------------------------------------------ // JDBC.java : exemple d'interrogation d'une base de données en Java // on indique les classes Java que l'on va utiliser import java.awt.event.*; // Evénements import java.awt.*; // Librairie graphique import java.sql.*; // Interrogation de bases de données class JDBCTest extends Frame { // la zone de texte dans laquelle s'affiche les résultats de la requête TextArea maZoneTexte; // le bouton qui sert à lancer la requête Button monBouton; // Command ID pour le bouton static final int cmdID = 1; //--------------------------------------------- // Méthode main appelée la première public static void main(String argv[]) { // Créer une instance de la classe JDBCTest (le constructeur sera appelé) JDBCTest monJDBCTest = new JDBCTest(); // Gérer la fermeture de la fenêtre monJDBCTest.addWindowListener(monJDBCTest. new WndAdapter()); }
Programme Java (2) //--------------------------------------------- // Méthode constructeur public JDBCTest() { // Création d'une fenêtre indépendante super("Java et Bases de données"); setLayout(new FlowLayout()); // Ajout de la zone de texte et du bouton maZoneTexte = new TextArea(25, 75); add(maZoneTexte); monBouton = new Button("Interrogation de la base de données Comptoir"); monBouton.addActionListener(new ButtonAdapter(cmdID)); add(monBouton); setSize(650, 500); setVisible(true); }
Programme Java (3) //--------------------------------------------- // Méthode d'affichage des résultats de la requête void affichageResultats(ResultSet results) throws SQLException { // Récupération d'information sur la structure des résultats ResultSetMetaData resultsMetaData = results.getMetaData (); // Récupération du nombre de colonnes des résultats int cols = resultsMetaData.getColumnCount(); // Boucle d'affichage des résultas while (results.next()) { // Affichage d'une ligne de résultat for (int i=1; i<=cols; i++) { // Affichage d'une colonne (un "champ" de la ligne courante if (i > 1) maZoneTexte.append("\t\t"); maZoneTexte.append(results.getString(i)); } // Sauter une ligne entre chaque résultat maZoneTexte.append("\n");
Programme Java (4) //--------------------------------------------- // Méthode makeAction lançant la requête protected void makeAction(int commandID) throws SQLException, Exception { if (commandID == cmdID) { // Stockage de la requête dans une chaine de caractères String maRequeteSQL = "SELECT Code, Contact FROM Clients WHERE Fonction = 'Propriétaire'"; // Affichage d'un message dans la zone de résultats maZoneTexte.append("Execution de : " + maRequeteSQL + "\n"); maZoneTexte.append("-----------------------------------------------\n"); // Chargement du driver JDBC-ODBC Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); // Connexion à la base de données "CDRama" Connection maConnexion = DriverManager.getConnection("jdbc:odbc:Comptoir", "Comptoir", "Comptoir"); // Préparation d'une requête SQL Statement maRequete = maConnexion.createStatement(); // Envoi de la requête ResultSet mesResultats = maRequete.executeQuery(maRequeteSQL); // Affichage des résultats this.affichageResultats(mesResultats); // Nettoyage mesResultats.close(); maRequete.close(); maConnexion.close(); }
Programme Java (5) //--------------------------------------------- // Classe adaptateur pour gérer les événements liés au bouton class ButtonAdapter implements ActionListener { //Identification du bouton (pas très orienté objet ...!) private int m_commandID; ButtonAdapter(int commandID) { m_commandID = commandID; } public void actionPerformed(ActionEvent e) try { makeAction(m_commandID); } catch(Exception ex) {} // Classe adaptateur pour gérer les événements liés à la fenêtre class WndAdapter extends WindowAdapter public void windowClosing(WindowEvent e) e.getWindow().dispose(); System.exit(0);