Les fichiers en Java

publicité
Les fichiers en java
Les fichiers en Java
1. L’écriture en mode texte brut
 les informations sont écrites en claires,
 séparées par un séparateur quelconque défini par l’utilisateur
 utilisable par n’importe quelle application
 nécessite un parsing à l'arrivée pour analyser les données
4 classes "mères", abstraites, pour traiter les flots de données héritant directement
d'Object :


pour traiter de flots d'octets
o la classe InputStream
o la classe OutputStream
pour traiter de flots de caractères
o la classe Reader
o la classe Writer
La classe FileReader permet de lire des caractères dans un fichier.
La classe FileWriter permet d'écrire des caractères dans un fichier.
Problématique : comment sauvegarder (ou transporter) un objet sachant qu’il est
composé d’instance d’autres objets, c’est à dire, que tout un graphe d’instances lui
est associé.
2. La sérialisation
 Compresse les informations de l’objet pour qu’il soit ‘transportable’
 Les données dans le fichier ne peuvent pas être lues comme du texte par
une autre application
 L’objet, lorsqu’il est lu, est décompressé, et retrouve son existence dans un
tas (ie une vm)
 permet d'échanger des données entre applications distribuées,
 permet la persistance des objets : un objet est persistant si sa durée de
vie est supérieure au programme qui l'a créé. Une des façons d'obtenir de
le persistance est la sérialisation dans des fichiers.
la sérialisation, c'est lire/écrire un objet dans un flot (flux)
Brigitte Groléas
Les fichiers en java
La sérialisation
Lecture et écriture d’objets dans un fichier, sur un flux, sur un stream en général
Un objet serialisable est transformable en une suite séquentiel d'octets.

o
en Java, au niveau de l'objet, il suffit d'implémenter l'interface
Serializable (qui n'a pas de méthode)
o
de tels flots en Java sont :

ObjectInputSteam en lecture, instancié à partir d'un
InputStream,
sa méthode readObject() peut lever une exception
ClassNotFoundException.
 readObject() renvoie un Object donc il faut faire un cast
pour récupérer le bon type

ObjectOutputSteam en écriture, instancié à partir d'un
OutputStream
sa méthode writeObject()
les classes FileInputStream et FileOutputStream :
o sont des sous-classes de respectivement InputStream et OutputStream
o
sont des flots (flux) pour la lecture/écriture des octets
o
permettent d'accéder à des fichiers sur disque
o
instancie un flot à partir d'un objet File
Brigitte Groléas
Les fichiers en java
Lire et écrire un texte dans le fichier
FileWriter fw;
fw = new FileWriter( "c:/titio.txt",true);
// true pour ouvrir en ajout
fw.write( "velo\n");
fw.close();
///////////////////
System.out.println("lecture car par car");
FileReader reader = new FileReader("c:/titio.txt");
int lu;
char c;
do {
lu = reader.read();
if (lu != -1) {
c = (char) lu;
System.out.print( c);
}
} while (lu != -1); // tant que l'on est pas à la fin du fichier
reader.close();
}catch (Exception e) {
}
//////////////////
System.out.println("lecture ligne à ligne");
FileReader fr = new FileReader( "c:/titio.txt");
BufferedReader br = new BufferedReader(fr); // pour ligne ligne à ligne
String s = br.readLine() ;
System.out.println(s);
fr.close();
Lire et écrire un token dans le fichier
Lire des entiers dans un fichier ne contenant que des entiers.
int somme = 0;
FileReader f = new FileReader("c:/titi.txt");
// Le fichier titi.txt contient 12 13 22 44 33 22
StreamTokenizer truc = new StreamTokenizer(f); // découpe le fichier en truc
while(truc.nextToken() == StreamTokenizer.TT_NUMBER) {
// S'arrete au premier non chiffre rencontré
somme += (int)truc.nval;
}
f.close();
System.out.println(somme);
Brigitte Groléas
Les fichiers en java
La classe File
////////////////////
System.out.println("tester l'existence d'un fichier");
File f = new File("c:/titio.txt");
if (f.exists()) System.out.println("existe");
else System.out.println("existe pas");
////////////////////
System.out.println("recuperer le nom sans le chemin");
File file = new File("c:/titio.txt");
System.out.println(file.getName());//affiche titio.txt
////////////////////
System.out.println(" renommer un fichier");
File nouveauNom=new File("c:/suiv.txt");
file.renameTo(nouveauNom);
// le fichier doit être fermé pour que ca fonctionne
//////////////////////
System.out.println("Lister les fichiers d'un répertoire");
File repertoire = new File("c:/");
String[] listeFichiers;
listeFichiers=repertoire.list();
for (int i=0;i < listeFichiers.length;i++)
System.out.println(listeFichiers[i]);
/////////////
Fenêtre de choix
JFileChooser dialogue = new JFileChooser();
if (dialogue.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) {
// dialogue.showOpenDialog(null) fenetre modale de saisie
// peut retourner APPROVE_OPTION ou CANCEL_OPTION
File fichier = dialogue.getSelectedFile();
// FileWriter ecrire = new FileWriter(fichier.getPath(), true);
FileWriter ecrire = new FileWriter(fichier);
ecrire.write("cerise");
ecrire.close();
}
System.exit(0);
Brigitte Groléas
Les fichiers en java
Lire les 20 premiers octets du fichier titi et les afficher à l’écran
package fichier;
import java.io.*;
public class Fic {
public static void main (String [ ] args) {
try {
// Ouverture du fichier titi
InputStream fluxFichier = new FileInputStream ("c:/titi.txt");
byte contenuFichier [ ] = new byte [20]; // Lecture des 20 premiers octets
fluxFichier.read (contenuFichier);
System.out.println (new String (contenuFichier));
fluxFichier.close ();
// Fermeture du fichier
}
catch (IOException e)
{
System.out.println (e);
}
}
}
RandomAccessFile
Fichier à accès aléatoire
Vous devez connaître la taille et la position de l’enregistrement. Mais cette taille
n’est pas nécessairement identique pour tous les enregistrements.
Constructeurs :
RandomAccessFile(File f, String mode)
RandomAccessFile(String n, String mode)
Mode =


"r" Ouverture en lecture seule
"rw" Ouverture en lecture/écriture. Si le fichier n'existe pas, on essaie de le
créer.
 "rws" Ouverture en lecture/écriture. La mise à jour du contenu du fichier et
de ses méta données est faite de façon synchrone.
 "rwd" Ouverture en lecture/écriture. La mise à jour du contenu du
fichier est faite de façon synchrone.
long getFilePointer() pour trouver où on se trouve dans le fichier
void seek(long pos)
pour se déplacer vers un nouvel emplacement dans le fichier
Brigitte Groléas
Les fichiers en java
long length()
pour déterminer la taille maximum du fichier
int read()
Lit un octet
int read(byte[] b)
Lit b octets et les range dans b
int read(byte[] b, int d, int l)
Lit l octets et les range dans b à partir de d.
boolean readBoolean()
Lit un booléen.
byte readByte()
Lit un octet.
char readChar()
Lit un caractère.
int readInt()
Lit un int.
String readLine()
Lit jusqu’au retour à la ligne
int skipBytes(int n)
Avance de n octets, renvoie le nbre réel d'octets sautés.
void write(byte[] b)
Ecrit le tableau d'octetsb.
void write(byte[] b, int d, int l) Ecrit l octets du tableau d'octets b, à patir de d.
void write(int b)
Ecrit l'octet de droite contenu dans b.
void writeBoolean(boolean v) Ecrit le booléen v.
void writeByte(int v)
Ecrit l'octet v.
void writeChar(int v)
Ecrit le caractère contenu dans v.
void writeInt(int v)
Ecrit l'entier v.
void writeBytes(String s)
Ecrit la chaîne sous la forme d'une suite d'octets
void writeChars(String s)
Ecrit la chaîne de caractères.
////////////////
Ecrit et relit 3 lignes dans un fichier
RandomAccessFile out = new RandomAccessFile ("c:/tit.txt","rw");
out.writeBytes("couou\nzz\n");
out.seek(0l);
String s = out.readLine();
System.out.println("la chaine 1 "+s);
s = out.readLine();
System.out.println("la chaine 2 "+s);
s = out.readLine();
System.out.println("la chaine 3 "+s);
out.close();
Lire et écrire un objet dans le fichier
import java.io.*;
public class Fich {
static Date tab[];
static Date tab2[];
public static void main(String[] args) throws Exception {
Brigitte Groléas
Les fichiers en java
tab = new Date[5];
tab[0]= new Date (10,12,2004,"septembre");
tab[1] = new Date (1,2,2004,"septembre");
tab[2] = new Date (1,11,2004,"octobre");
tab[3] = new Date (4,9,2004,"septembre");
tab[4]= new Date (21,2,2003,"sssse");
tab2 = new Date[5];
FileOutputStream fichier = new FileOutputStream("c:/essai");
try {
ObjectOutputStream flotEcriture = new ObjectOutputStream(fichier);
for (int i=0; i<5; ++i)
flotEcriture.writeObject(tab[i]);
flotEcriture.close();
} catch (IOException e) {
System.out.println(" erreur :" + e.toString());
}
System.out.println ( "lecture");
FileInputStream fichier2 = new FileInputStream("c:/essai");
try {
ObjectInputStream flotLecture = new ObjectInputStream(fichier2);
Object lu;
for (int i=0; i<5; ++i) {
lu = flotLecture.readObject();
if (lu instanceof Date) {
tab2[i]=(Date)lu;
}
else {System.out.println("eee");}
}
flotLecture.close();
}catch (Exception e) {
System.out.println(" erreur :" +e.toString());
}
for (int i=0; i<5; ++i)
tab2[i].affiche();
}
}
Brigitte Groléas
Téléchargement