Fichiers et entrées-sorties en Java File and Input-ouput in Java J.M. Vanel Conseil informatique, architecture
Plan ● Un exemple «simple» ● La classe File ● Notion de flot (stream); multiples sources et destination ● Les octets et les caractères ● La hiérarchie de InputStream et OutputStream: octets ● La hiérarchie de Reader et Writer: caractères ● Les encodages ● RandomAccessFile ● Sauver un graphe d’objets en XML : XMLEncoder ● Lire un fichier XML via SAX, via DOM
Un exemple «simple» Lire une ligne au clavier : BufferedReader in = new BufferedReader( new InputStreamReader(System.in)); String line = in.readLine(); Extrait de « Java in a Nutshell » par David Flanagan
La classe File ● Ne s'occupe que du nom du fichier, des permissions, des répertoires, etc ● Ne pas s'occupe pas du contenu
Notion de flot (stream); multiples sources et destination ● Voirhttp://java.sun.com/docs/books/tutorial/essential/io /overview.htmlhttp://java.sun.com/docs/books/tutorial/essential/io /overview.html ● Entrées sorties traitées uniformément: fichiers, réseau, périphériques, tampons mémoire
Les classes ● Diagrammes ● rview.html rview.html ● Tableau: ● sinks.html sinks.html
Méthodes de base InputStream int read() int read(byte cbuf[]) int read(byte cbuf[], int offset, int length) OutputStream int write(int c) int write(byte cbuf[]) int write(byte cbuf[], int offset, int length)
Les octets et les caractères ● Fichiers binaires: on utilise les E/S par octets : XXXStream ● Fichiers caractères: on utilise les E/S par caractères: XXXReader et XXXWriter
La hiérarchie de InputStream et OutputStream: octets
La hiérarchie de Reader et Writer: caractères
Enrobages (wrappers) ● Alias modèle de conception « décorateur » ● Exemple «simple» revisité BufferedReader in = new BufferedReader( new InputStreamReader( System.in)); ● Double enrobage – De InputStream à InputStreamReader – De InputStreamReader à BufferedReader
Enrobages 2 (wrappers) ● Le décorateur de base est FilterInputStream ● Voir le reste de la hiérarchie avec eclipse
Les encodages ● Sur 1 octet : – ASCII – iso , Cp1215,... – UTF-8 (multi-octets pour tout ce qui n’est pas ASCII ) ; commence par FFFE ● Sur 2 octets: UTF-16 ● Sur 4 octets: UTF-32 : Unicode Il faut avoir un éditeur de texte UTF-8, par exemple gvim :set fileencoding=iso
Représentation interne encodages ● Classes – InputStreamReader – OutputStreamWriter ● Encodage indiqué dans le constructeur ● Voir dans le JDK: docs/guide/intl/encoding.doc.html la listes des encodages
RandomAccessFile En plus des méthodes normales: int skipBytes(int); // Moves the file pointer forward the specified number of bytes void seek(long); // Positions the file pointer just before the specified byte long getFilePointer() // Returns the current byte location of the file pointer
Sauver un graphe d’objets en XML : 1 - XMLEncoder String saveFileName = getSaveFileName(); XMLEncoder e = new XMLEncoder( new BufferedOutputStream( new FileOutputStream( saveFileName))); e.writeObject( testSpec ); e.close();
Sauver un graphe d’objets en XML : 2 - XMLDecoder Pour relire l'objet sauvé, il faut utiliser XMLDecoder : XMLDecoder d = new XMLDecoder( new BufferedInputStream( new FileInputStream( getSaveFileName()))); testSpec = (TestSpecification) d.readObject(); d.close();
Lire un fichier XML via SAX, via DOM ● Via SAX (Simple API for XML) – Implémenter ContentHandler – Le donner à un SAXParser – Lancer SAXParser.parse(monFichier) ● Via DOM Document doc = DocumentBuilderFactory.newInstance(). newDocumentBuilder().parse( " mon texte " );
Lire un fichier XML via SAX, via DOM ● Didacticiel chez Sun : ● Working with XML XML and the Document Object Model (DOM) ial/TOC.html ial/TOC.html