Application
Transcription
Application
2 Flux Flots Fli Fla Flu ? Flux • Flux = Flots = Streams • Source d’entrée ou puits de sortie • Séquence de données (octets) Stéphane HUOT Dpt. Informatique DUT Informatique - S3 - 2008 3 • Mode d’accès unifié à des ressources: o de types différents 4 Fichier local Fichier distant Flux réseau Flux multimédia ... • fichiers o binaires (propriétaire, images, audio, compressés,...) o texte (formatés ou non) • flux réseau • flux multimédia FLUX D’ENTRÉE OU DE SORTIE (INPUTSTREAM/OUTPUTSTREAM) • ... o de provenances différentes • locaux • volatiles FileInputStream FileOutputStream ObjectInputStream ObjectOutputStream AudioInputStream AudioOutputStream • distants • Tout des séquences d’octets Application ...InputStream ...OutputStream 5 • Le package java.io • Les fichiers, la classe File • Les classes abstraites de flux • Accès unifié à des ressources différentes, peu importe la représentation interne: o facilite la tâche du programmeur o améliore l’adaptabilité du code o permet l’indépendance de l’application vis-àvis des ressources 6 o InputStream : flux d’entrée o OutputStream : flux de sortie • Les classes dérivées o • Exemple: System.in et System.out ... • Voir Javadoc 7 • Souvent nécessaires aux applications o o pour lire des données pour écrire des données • Locaux (DD, périph ext., ...) ou distants (réseau) : peu importe • Fichiers binaires ou textuels 8 • java.io.File • Représentation abstraite de chemins de fichiers et de répertoires => descripteur • Permet de : o créer, supprimer des fichiers/répertoires : createNewFile(), delete(), ... o lire leurs propriétés : exists(), isFile(), isDirectory(), canRead(), canWrite(), listFiles(), ... o changer leur propriétés : setReadable(boolean b), setWritable(), ... 9 package file; 10 private static void infosFichier(File f) { 1 if (f.exists()) 2 System.out.println("- Le fichier " + f.getName() + " existe."); 3 else 4 System.out.println("- Le fichier " + f.getName() + " n'existe pas."); 5 if (f.isDirectory()) { 6 System.out.println("- Le fichier " + f.getName() + " est un répertoire qui contient " + f.list().length + " fichiers/répertoires."); 7 } 8 else 9 System.out.println("- Le fichier " + f.getName() + " n'est pas un répertoire."); 10 System.out.println("- Le chemin absolu du fichier est " + f.getAbsolutePath()); 11 System.out.println("- La taille du fichier est " + f.length() + " octets."); 12 if (f.isHidden()) 13 System.out.println("- Le fichier " + f.getName() + " est caché."); 14 if (f.canRead()) 15 System.out.println("- Le fichier " + f.getName() + " est lisible."); 16 if (f.canWrite()) 17 System.out.println("- Le fichier " + f.getName() + " n'est pas protégé en écriture."); 18 if (f.canExecute()) 19 System.out.println("- Le fichier " + f.getName() + " est exécutable."); 20 System.out.println("***************************************"); import java.io.*; public class ApplicationFile { public static void main(String[] args) { 1 //création d'un objet File quelconque 2 File fichierTest = new File("fichierTest"); 3 //lecture de ses informations 4 infosFichier(fichierTest); 5 //création d'un fichier représentant home directory de l'utilisateur 6 File home = new File(System.getProperty("user.home")); 7 //lecture des informations de chaque répertoire/fichier 8 for (File f : home.listFiles()) { 9 infosFichier(f); } } //suite au prochain transparent } } 11 - Le fichier fichierTest n'existe pas. - Le fichier fichierTest n'est pas un répertoire. - Le chemin absolu du fichier est /Volumes/Warehouse/Work/Teaching/IUT/2007-2008/Java/Dev/CoursFlux/fichierTest - La taille du fichier est 0 octets. ***************************************************************************** - Le fichier .bash_history existe. - Le fichier .bash_history n'est pas un répertoire. - Le chemin absolu du fichier est /Users/Stuf/.bash_history - La taille du fichier est 6000 octets. - Le fichier .bash_history est caché. - Le fichier .bash_history est lisible. - Le fichier .bash_history n'est pas protégé en écriture. ***************************************************************************** - Le fichier Sites existe. - Le fichier Sites est un répertoire qui contient 4 fichiers/répertoires. - Le chemin absolu du fichier est /Users/Stuf/Sites - La taille du fichier est 204 octets. - Le fichier Sites est lisible. - Le fichier Sites n'est pas protégé en écriture. - Le fichier Sites est exécutable. ***************************************************************************** - Le fichier test.des existe. - Le fichier test.des n'est pas un répertoire. - Le chemin absolu du fichier est /Users/Stuf/test.des - La taille du fichier est 239 octets. - Le fichier test.des est lisible. - Le fichier test.des n'est pas protégé en écriture. ***************************************************************************** 12 • La classe abstraite InputStream pour lire: o abstract int read(): lit l’octet suivant, -1 sinon o int read(byte[] b): remplit le tableau o ... • La classe abstraite OutputStream pour écrire: o abstract void write(byte b): écrit l’octet b o void write(byte[] b): écrit les octets o ... • Peuvent lever IOException 13 14 • Classes concrètes: FileInputStream et FileOutputStream • exemple, lecture d’un fichier en entier: 1. Création du flux (entrée ou sortie): • instanciation d’un objet d’une classe concrète qui étend InputStream ou OutputStream (selon le type du flux) • la source du flux est en général passée en paramètre du constructeur (chemin ou descripteur de fichier, URL/URI, flux réseau, ...) 1 try { 2 InputStream in = new FileInputStream("donnees.dat"); 3 byte[] donnees = new byte[in.available()]; 4 in.read(donnees); 5 in.close(); 6 System.out.println(donnees.length + " octets ont été lus."); 7 } catch (Exception e) { 8 System.err.println(e.getMessage()); 9 } • le flux est ouvert (en lecture ou écriture) à la construction de l’objet (modulo problème => exception) 2. Utilisation du flux • lecture (méthodes read) ou écriture (méthodes write) 3. Fermeture du flux • méthode close() 15 16 • Lecture par octet: • Ecriture identique avec les méthodes write 1try { 2 InputStream in = new FileInputStream("donnees.dat"); 3 int donnee; 4 while ((donnee = in.read()) != -1) { 5 System.out.println("Octet lut: " + donnee); 6 } 7 in.close(); 8} catch (Exception e) { 9 System.err.println(e.getMessage()); } 10 • Lecture/écriture avec un buffer o BufferedInputStream et BufferedOutputStream o BufferedInputStream bin = new BufferedInputStream(new FileInputStream("donnees.dat")); • Lecture/écriture de données typées (Boolean, Double, ...) o DataInputStream (readBoolean(), ...) et DataOutputStream o DataInputStream din = new DataInputStream(new FileInputStream("donnees.dat")); • Voir Javadoc... 17 • Fichiers binaires avec un encodage particulier: jeu de caractères • Lecture par ligne: 1 try { 2 BufferedReader inText = new BufferedReader(new InputStreamReader(new FileInputStream("donnees.txt"))); 3 String ligne; 4 while ((ligne = inText.readLine()) != null) { 5 System.out.println("La ligne lue est: " + ligne); 6 } 7 inText.close(); 8 } catch (Exception e) { 9 System.err.println(e.getMessage()); 10} • Lecture/écriture: o toujours avec des InputStream et OutputStream o interprétation de l’encodage: InputStreamReader et InputStreamWriter ou BufferedReader et BufferedWriter (tampon et lecture/écriture par ligne) 18 • Lecture par caractère(s): int read() et int read(char[] cbuf, int off, int len) 19 1 try { 2 BufferedWriter outText = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("donnees.txt"))); 3 outText.write("Première ligne\n"); 4 String ligne2 = "Seconde ligne"; 5 outText.write(ligne2 + "\n"); 6 outText.close(); 7 } catch (Exception e) { 8 System.err.println(e.getMessage()); 9 } 20 • Classes de bases: implantations de InputStream/ OutputStream • Ajout d’un buffer: BufferedInputStream/ BufferedOutputStream, à partir d’un InputStream/ OutputStream • Ajout de l’interprétation de caractères: InputStreamReader/OutputStreamWriter, à partir d’un InputStream/OutputStream • Encapsulation pour de nouvelles capacités (pattern decorator) • voir Javadoc... 21 • Pour lire/écrire des flux pré-formatés (HTML, XML, ...) • Pour sauver/charger des objets Java (sérialisation) • Lire et écrire des archives (zip et jar) • Lire et écrire des images • ... 22 • eXtended Markup Language • Fichiers textuels formatés (balises) • Cohérence et vérification du format (DTD et schémas) • Format d’échange très répandu (applications, BD, Web, ...) • Java fournit des outils pour lire et écrire (parseurs SAX et DOM auxquels on attache des ‘Streams’) 23 24 • Tous les attributs à sérialiser doivent euxmême implanter Serializable • packages java.util.zip et java.util.jar • Permettent de compresser et décompresser • Descripteurs particuliers: ZipFile et JarFile • Descripteurs des données internes: ZipEntry et JarEntry • Utilisation des classes ObjectInputStream et ObjectOutputStream pour lire et écrire (readObject et writeObject) • Flux pour lire et écrire: ZipInputStream et ZipOutputStream, JarInputStream et JarOutputStream • Persistance des données • Ecriture/lecture directe d’objets (instances) de l’application dans des flux (fichiers, réseau, ...) • Les classes doivent implanter l’interface Serializable 25 - Accès unifié aux res sources: flux d’octets - Ouvrir, utiliser, ferme r - Décoration des InputS tream et OutputStream de base pour des fonctionnalités supplé mentaires