Accueil
Java Standard Edition
Java EE 5
Visual Basic .Net 2005
Visual C++ .Net 2005
Visual C# .Net 2005
Cours ASP .Net 2.0
Postgresql
Linux
Visual Studio 2008
ASP 3.0 Classique
Cours Javascript - DOM - DHTML
Cours Ajax
VBA
Assembleur
Perl
Membres
L'auteur du site
Nouveautés sur le site
Contacts
Plan du site
Exécution d'un programme
Les archives Jar
Les classes abstraites
Les interfaces
Les tableaux
La généricité
Les énumérations
Les classes internes
Classes anonymes et internes locales
Les threads: généralités
Les threads(2): synchronisation
E/S(1):InputStream et OutputStream
E/S(2):FileInputStream et FileOutputStream
E/S(3):Reader et Writer
E/S(4):FilterInputStream et FilterOutputStream
E/S(5):Les filtres d'octets: PrintStream
E/S(6):Les filtres d'octets: DataInputStream et DataOutputStream
E/S(7):Les filtres d'octets: BufferedInputStream et BufferedOutputStream
E/S(8):Flux de caractères: PrintWriter
E/S(9):Flux de caractères: FilterReader et FilterWriter
E/S(10):Flux de caractères: InputStreamReader, OutputStreamWriter, StreamDecoder, StreamEncoder
E/S(11):Flux de caractères: BufferedReader et BufferedWriter
E/S(12):Flux de caractères: FileReader et FileWriter
La classe String (java.lang)
Les collections: L'interface Collection(java.lang)
Les collections(2): L'interface List(java.util)
Les collections(3): AbstractCollection(java.util)
Les collections(4): AbstractList(java.util)
Les collections(5): Vector(java.util)
Les collections(6): L'interface Map(java.util)
Les collections(7): AbstractMap(java.util)
Les collections(8): HashMap(java.util)
La bibliothèque Swing en Java
Les bases de données en Java
JDBC ( Java Database Connectivity )
Les interfaces graphiques
Les fichiers de configuration en Java
INSTALLATION JAVA EE 5, JRE 6, ECLIPSE, TOMCAT, ETC SOUS LINUX
INSTALLATION JAVA EE 5, JRE 6, ECLIPSE, TOMCAT, ETC SOUS WINDOWS
Les applications Web en java
Les filtres Java (javax.servlet.Filter)
I Généralités
I.1 Le formulaire principal
I.2 Les objets créés par Visual
I.3 Les variables références
I.4 Le garbage collector
II Créer évènements
II.1 Rappel évènements
II.2 Procédure à suivre
II.2.1 Créer son EventArgs
II.2.2 Créer EmetEvent
II.2.3 Déclarations autres
I Généralités
I.1 Applications winforms
I.2 Applications MFC
I.3 Objets managés ou pas
I.4 Objets non managés
I.5 Objets managés - handle
I.6 Le top-level ^
II Créer évènements
II.1 Rappel évènements
II.2 Procédure à suivre
II.2.1 Créer son EventArgs
II.2.2 Créer EmetEvent
II.2.3 Déclarations autres
I Généralités
I.1 Puissant et Accessible
I.2 Créer ses classes
II Créer évènements
II.1 Rappel évènements
II.2 Procédure à suivre
III Les services Windows
IV Le .net remoting
V Communication Tcp avec TcpClient et TcpListener
II.2.1 Créer son EventArgs
II.2.2 Créer EmetEvent
II.2.3 Déclarations autres
I Généralités
I.1 Un EDI formidable
I.2 Inclure C# ou VB
I.3 L'objet Response
I.4 Les évènements
II ASP .net et les bdd
II.1 Essayer plusieurs fois la requête
I 2.1 Fichiers distincts
I.2.2 Avec la balise script
I.2.3 Inclure réellement
I.2.4 Avec Response.Write()
I.3.1 La méthode Response.Redirect()
I.4.1 Résoudre problème post
Installation Postgre Linux
Cours Postgresql
Le Shell Unix( Linux, Ubuntu)
Les scripts C-Shell
Programmation système Unix
Reseau Linux
Les iptables
Windows Presentation Foundation(WPF)
Le Framework 3.0
Windows Workflow Foundation(WF)
ASP 3.0 Classique
Cours Javascript - DOM - DHTML
Chat Ajax
VBA Excel 2003
Assembleur
Perl
Inscription
Liste membres
Livre d'or
Forum
Accueil
>
Java Standard Edition
>
E/S(2):FileInputStream et FileOutputStream
____________________________________________________________________________________________________
Connexion
Java SE - Les entrées sorties(2) - Les fichiers binaires: Les classes java.io.FileInputStream et java.io.FileOutputStream
Sommaire :
I)Généralités
II) La classe java.io.FileInputStream
II-1) Les méthodes native
II-2) Les contructeurs de la classe FileInputStream
II-3) La classe java.io.FileDescriptor
II-4) La classe java.io.File et la classe java.io.FileSystem
III) La classe java.io.FileOutputStream
III-1) Les contructeurs de la classe FileOutputStream
III-2) Les méthodes native de FileOutputStream
IV)Code source complet de l'exemple
V) Téléchargement de l'exemple
I) Généralités
On utilise les classes java.io.FileInputStream et java.io.FileOutpoutStream, pour lire des octets bruts. Pour lire et écrire des caractères, utiliser FileReader et FileWriter.
java.io.FileInputStream et java.io.FileOutputStream héritent directement de java.io.InputStream et java.io.OutputStream respectivement
II) La classe java.io.FileInputStream
public class FileInputStream extends InputStream;
Classe utilisée pour la lecture de fichiers d'octets bruts.
II-1) Les méthodes native
Elle contient un certain nombre de méthodes natives, pour des primitives de base. Comme:
public native int read() throws IOException;
ou encore(méthode privée utilisée par les deux autres méthodes read):
private native int readBytes(byte b[], int off, int len) throws IOException; public int read(byte b[]) throws IOException { return readBytes(b, 0, b.length); } public int read(byte b[], int off, int len) throws IOException { return readBytes(b, off, len); }
Ces méthodes natives n'ont pas été écrites en Java, elles l'ont été dans un langage dépendant du système d'exploitation, par exemple le langage C ou C++.
La machine virtuelle possède le code compilé de ces méthodes( C compilé par exemple, toujours du langage machine) dans des dlls dont elle possède une version différente selon le système d'exploitation(la machine virtuelle installée est différente selon le système d'exploitation).
On peut comprendre que tout ne peut pas être écrit en Java. Il arrive un moment où on a besoin de primitives de base, qui ne peuvent pas être écrites en Java, comme par exemple la lecture d'un octet d'un fichier, ou de n octets d'un fichier.
II-2) Les contructeurs de la classe FileInputStream
Il y a plusieurs constructeurs:
public FileInputStream(String name) throws FileNotFoundException
public FileInputStream(File file) throws FileNotFoundException
public FileInputStream(FileDescriptor fdObj)
public FileInputStream(String name) fait uniquement:
this(name != null ? new File(name) : null);
Ce constructeur utilise, comme on peut le constater, le constructeur ci-dessous, avec un File en paramètre.
public FileInputStream(File file);
Remarque intéressante: le constructeur public FileInputStream(File file) fait un (FileInputStream.)open du fichier(donc le constructeur public FileInputStream(String name) aussi).
et
public FileInputStream(FileDescriptor fdObj)
Ce constructeur sera détaillé au paragraphe suivant.
II-3) La classe java.io.FileDescriptor
Revenons au constructeur
public FileInputStream(FileDescriptor fdObj)
Le FileDescriptor est un objet système-dépendant( c'est à dire dont la valeur a été établie par le système d'exploitation sous-jacent).
Le File Descriptor représente une connexion existante à un fichier ouvert, ou une socket ouverte, ou une autre connexion d'entrée/sortie active. On ne peut pas créer nous même de FileDescriptor pour un fichier(ou socket, etc) particulier ouvert, il faut l'obtenir par une méthode java native qui va initialiser le champ privé int fd d'un objet FileDescriptor qu'on lui aurait passé en paramètre. Ce champ privé fd est à initialiser par exemple en C, avec le résultat de la fonction C open.
A noter que la classe FileInputStream possède un attribut privé fd qui est un FileDescriptor. Ce champs est initialisé avec un new FileDescriptor() par les deux constructeurs FileInputStream(String name) et FileInputStream(File file), ce qui crée un objet fd avec un filedescriptor invalide( qui vaut -1!). Le seul constructeur public de FileDescriptor construit, en effet, un objet FileDescriptor invalide, car une application java n'a pas à construire d'elle-même de FileDescriptor initialisé.
L'objet FileDescriptor est un objet qui sert d'interface entre un langage dépendant du système comme C ou C+, et java, et ainsi pour transmettre une valeur de descripteur de fichier obtenue directement par le système d'exploitation sous-jacent.
II-4) La classe java.io.File et la classe java.io.FileSystem
LA classe java.io.File est une représentation abstraite de noms de fichiers(ou de répertoires) qui sont indépendants du système d'exploitation utilisé.
La conversion entre un nom de fichier abstrait et un nom de fichier réelle est système-dépendante.
A noter un attribut static privé fs, représentant le file system:
static private FileSystem fs = FileSystem.getFileSystem();
La classe java.io.FileSystem possède une méthode normalize qui est utilisée par public File(String pathname). Cette méthode effectue une conversion du nom de fichier réelle vers un nom de fichier abstrait. Ainsi, dans le constructeur File(String pathname), on a:
this.path = fs.normalize(pathname);
La méthode normalize de la classe FileSystem:
public abstract String normalize(String path);
A noter que la méthode (FileSystem.)getFileSystem est native:
public static native FileSystem getFileSystem();
Une méthode native peut parfaitement retourner des objets qui sont des instances(initialisées) d'une de nos classes java(Ici un objet de la classe java.io.FileSystem est créé par une méthode native)
III) La classe java.io.FileOutputStream
public class FileOutputStream extends OutputStream
Elle hérite de java.io.OutputStream
C'est une classe qui ressemble à FileInputStream.
Elle a aussi un attribut privé fd:
private FileDescriptor fd;
III-1) Les contructeurs de la classe FileOutputStream
public FileOutputStream(String name) throws FileNotFoundException { this(name != null ? new File(name) : null, false); }
Il utilise le constructeur FileOutputStream(File file, boolean append).
public FileOutputStream(String name, boolean append) throws FileNotFoundException { this(name != null ? new File(name) : null, append); }
Il utilise le constructeur FileOutputStream(File file, boolean append).
public FileOutputStream(File file) throws FileNotFoundException { this(file, false); }
Il utilise le constructeur FileOutputStream(File file, boolean append).
public FileOutputStream(File file, boolean append) throws FileNotFoundException;
public FileOutputStream(FileDescriptor fdObj);
III-2) Les méthodes native de FileOutputStream
Les primitives de base sont native, ce qui semble parfaitement logique.
/** * Opens a file, with the specified name, for writing. * @param name name of file to be opened */ private native void open(String name) throws FileNotFoundException; /** * Opens a file, with the specified name, for appending. * @param name name of file to be opened */ private native void openAppend(String name) throws FileNotFoundException; /** * Writes the specified byte to this file output stream. Implements * the
write
method of
OutputStream
. * * @param b the byte to be written. * @exception IOException if an I/O error occurs. */ public native void write(int b) throws IOException; /** * Writes a sub array as a sequence of bytes. * @param b the data to be written * @param off the start offset in the data * @param len the number of bytes that are written * @exception IOException If an I/O error has occurred. */ private native void writeBytes(byte b[], int off, int len) throws IOException; //(...) private native void close0() throws IOException;
Deux méthodes public d'écriture, et une de fermeture utlisent ces méthodes native:
public void write(byte b[]) throws IOException { writeBytes(b, 0, b.length); } public void write(byte b[], int off, int len) throws IOException { writeBytes(b, off, len); } public void close() throws IOException { if (channel != null) channel.close(); close0(); }
IV)Code source complet de l'exemple
package main; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; /** * * @author sabri Koffler pour www.infkoffler.com, exemple du cours Java Standard * @version 1.0 (de l'application) / 2/11/2008 * Créé 2/11/2008 * Programme d'exemple pour les entrées-sorties(2): Les classes * java.io.FileInputStream et java.io.FileOutputStream * */ public class Main { /** * Méthode de test. Va créer un fichier avec le nom en paramètre, * contenant 100 octets valant de 0 à 99. * @param pNomFichier Le nom du fichier à créer */ private static void creerMonFichier(String pNomFichier) { //Ecriture d'un fichier avec 100 octets dedans, qui ont //pour valeur de 0 à 99 FileOutputStream monFluxSortie; byte tab[] = new byte[100]; try { monFluxSortie = new FileOutputStream(pNomFichier); } catch (FileNotFoundException e) { e.printStackTrace(); return; } for (int i=0;i<100;i++) { tab[i] = (byte)i; } try { monFluxSortie.write(tab); } catch (IOException e) { e.printStackTrace(); return; } finally { //exécuté même si exception //de monFluxSortie.write(tab), et malgré le return. //Dans ce cas, le bloc finally sera exécuté juste avant le return try { monFluxSortie.close(); } catch (IOException e) { e.printStackTrace(); return; } } } /** * Méthode de test. Va lire le contenu du fichier et l'afficher * @param pNomFichier */ private static void lireMonFichier(String pNomFichier) { FileInputStream monFluxEntree; byte[] tab = new byte[100]; try { monFluxEntree= new FileInputStream(pNomFichier); } catch (FileNotFoundException e) { e.printStackTrace(); return; } try { monFluxEntree.read(tab); } catch (IOException e) { e.printStackTrace(); return; } finally { //exécuté même si exception //de monFluxEntree.read(tab), et malgré le return //Dans ce cas, le bloc finally sera exécuté juste avant le return try { monFluxEntree.close(); } catch (IOException e) { e.printStackTrace(); return; } } for (int i = 0; i<100; i++) { System.out.println(tab[i]); } } /** * @param args * @throws IOException */ public static void main(String[] args) { String nomFichier="C:\\Users\\jean\\testOutput.bin"; Main.creerMonFichier(nomFichier); Main.lireMonFichier(nomFichier); //affiche les nombres de 0 à 100 } }
V) Téléchargement de l'exemple
Projet d'exemple, V1.0
RETOUR HAUT