7 Gestion des données en mémoire secondaire
Données persistantes en mémoire secondaire
–
unité de disque
Organisation physique des données
–
façon dont les données sont structurées en mémoire secondaire
Méthode d'organisation des données
–
structure de données particulière utilisée pour
organiser les données en mémoire secondaire
27/02/22 © Robert Godin. Tous droits réservés 2
Critères d'évaluation des méthodes d'organisation
Temps d'accès aux données par rapport à différentes méthodes d'accès
– sériel, sélection, ...
Délai d'insertion et de suppression
Occupation mémoire
Conception physique
Choix des méthodes d ’organisation
– organisation sérielle
– organisation séquentielle
– indexage
– hachage
– organisation par grappe
– ...
Schéma interne de la BD
27/02/22 © Robert Godin. Tous droits réservés 4
7.1 Principales caractéristiques des disques
Unité de disque (disk pack ) ou disque
P is t e
C y lin d r e
S e c t e u r
P la t e a u
T ê t e d e
le c t u r e / é c r it u r e
Capacité de Superbit
capacitéDisque = nbSurfaces nbCylindres nbSecteursParPiste tailleSecteur
= 20 surfaces 1000 cylindres 50 secteurs par piste 512 octets
= 512,000,000 octets 500,000 kilooctets(K) 500 mégaoctets (M)
Paramètre Valeur
Nombre de surfaces ( nbSurfaces ) 20
Nombre de pistes par surface ( nbCylindres ) 1000
Nombre de secteurs par piste ( nbSecteursParPiste ) 50
Nombre d'octets de données par secteur ( tailleSecteur ) 512
27/02/22 © Robert Godin. Tous droits réservés 6
Transfert d ’un secteur
Secteur
–
unité d'adressage et de transfert minimal
Adresse physique de secteur
–
numéro de surface (noSurface), numéro de cylindre (noCylindre), numéro de secteur dans la piste
(noSecteur)
Adresse relative de secteur (noSecteurRelatif)
–
dans l'intervalle [0..n-1]
Tampon (buffer )
–
zone de la mémoire centrale où transitent les données de
la mémoire secondaire
7.1.1Modèle simple d'estimation du coût d'une entrée/sortie (transfert) sur disque
Temps de transfert (entrée/sortie) de n octets
–
TempsESDisque(n) = TempsPosDébut + TempsTrans (n)
TempsPosDébut = TempsDépBras + TempsRotation (10ms)
– TempsDépBras :
6-25 ms (6ms)
– TempsRotation :
4,18 à 8,35 ms = 60 à 120 tours/sec (4ms)
TempsTrans(n) = n / TauxTransVrac
– TauxTransVrac = NombreOctetsPiste / TempsRotationComplète (2M/sec)
– ex: TempsTrans(2K) = 2K / 2M/sec = 1ms
ex: TempsESDisque(2K) = 10ms + 1ms = 11ms
Minimiser le nombre d'entrées/sorties en mémoire
secondaire
27/02/22 © Robert Godin. Tous droits réservés 8
Importance de la contiguïté physique
Ex: transfert de 2000 secteurs de 512 octets (1M)
– Secteurs consécutifs
TempsESDisque(1M) = 10ms + 500ms = 510ms
– Secteurs dispersés aléatoirement
TempsESDisque(un secteur) = 10ms + 0,25ms = 10,25ms
Total = 2000 10,25 = 20 500 ms = 20,5 secs
Effet de grappe (clustering)
– regrouper physiquement selon patrons d ’accès
logiques
7.1.2 Contrôleur de disque
Contrôleur de disque (disk controller )
–
processeur simple et indépendant de l'unité centrale de traitement
–
DMA (« Direct Memory Access »)
Interface du contrôleur :
–
type de transfert (lecture ou écriture)
–
adresse du premier secteur
–
nombre de secteurs à transférer
–
adresse du tampon
Normes pour PC
–
IDE/ATA, SCSI
27/02/22 © Robert Godin. Tous droits réservés 10
7.1.3 Autres types d'unité de mémoire secondaire
Type d'unité Temps de positionnement (ms)
Taux de
transfert en vrac (M/ sec)
Capacité
(M) Coût ($/ M) Particularité
Mémoire vive 10
-6-10
-510
2-10
30-10
410-10
2Volatile
Disque 1-10 1-10
210-10
410
-1-1 Non amovible
Disque
amovible 10-10
21 10-10
31-10
Disquette 10
210
-11 10
-1Disque
Optique 10
210
-1-1 10
2-10
310
-2-10
-1Cédérom non
modifiable Bande
magnétique 10
61-10 10
2-10
610
-3-10
-2Accès direct
prohibitif
Tableau comparatif des types de
mémoire
7.2 Fichiers et répertoires
Système de gestion de fichier (SGF, file system)
– abstraction des mémoires secondaires sous forme d'un ensemble de fichiers
Hiérarchie des répertoires (directory hierarchy) ou répertoire
– structure d ’arbre
– dossier, catalogue
27/02/22 © Robert Godin. Tous droits réservés 12
Cas de UNIX
Chemin du fichier (“ file path ”)
– /usr/degas/travaux/fibonacci.cpp
u s r b in
/
d e v
m o n e t d e g a s
t r a v a u x
f ib o n a c c i f ib o n a c c i . c p p
c v . t x t
Volume racine
Descripteur de fichier (file descriptor )
Ensemble d ’attributs du fichier
– Nom du fichier
– Type de fichier
– Propriétaire
– Date de création
– Date de dernière modification
– Paramètres de protection
– Taille actuelle
– Taille maximale
– Référence à la table d'allocation des fichiers
27/02/22 © Robert Godin. Tous droits réservés 14
Descripteur de répertoire
Ensemble d ’attributs du répertoire
– Nom du répertoire
– Type de répertoire
– Propriétaire
– Date de création
– Paramètres de protection
– Taille
– Collection de références aux sous-répertoires
– Collection de références aux fichiers sous ce
répertoire
Unité de mémoire secondaire logique /physique
Partition du disque (disk partition)
– découper un disque en plusieurs partitions
– unité logique de mémoire secondaire
Descripteur de disque
– partitions, hiérarchie des répertoires et fichiers
– maintenu sur disque
27/02/22 © Robert Godin. Tous droits réservés 16
Services de base
Ouvrir (IN cheminFichier, OUT idInterne,…)
–
SGF crée une entrée dans la table des fichiers ouverts
–
idInterne : référence à la table des fichiers ouverts
–
mode d ’accès : lecture/écriture, accès
direct/séquentiel, création ou fichier existe déjà ,…
–
allocation d ’espace
–
exceptions
Fermer (IN idInterne, …)
–
libère l ’entrée de la table des fichiers ouverts
–
évacuer tampons
7.3 Organisation par bloc
Fichier ~ tableau de blocs (taille variable)
–
LireBloc(IN idInterne, IN numéroBloc, OUT tamponApplication,…)
–
ÉcrireBloc(IN idInterne, IN numéroBloc, IN tamponApplication,…) 0
1 2
#bloc
27/02/22 © Robert Godin. Tous droits réservés 18
Bloc, page ou
enregistrement physique
Ensemble de bits d'une taille fixe
– habituellement n secteurs (1, 2, 4, 8,…)
– traduction bloc => secteur
Unité de base de transfert de données
Unité minimale d'allocation d'espace
Allocation des secteurs aux blocs de Superbit
Allocation par cylindre pour minimiser déplacement du bras
noBloc noSecteurRelatif noPiste noSurface noSecteur
0 0-4 0 0 0-4
1 5-9 0 0 5-9
2 10-14 0 0 10-14
3 15-19 0 0 15-19
... ... ... ... ...
9 45-49 0 0 45-49
10 50-54 0 1 0-4
11 55-59 0 1 5-9
... ... ... ... ...
20 100-104 0 2 0-4
21 105-109 0 2 5-9
... ... ... ... ...
190 950-954 0 19 0-4
191 955-959 0 19 5-9
... ... ... ... ...
200 1000-1004 1 0 0-4
201 1005-1009 1 0 5-9
... ... ... ... ...
Paramètre Valeur
nbSurfaces 20
nbCylindres 1000
nbSecteursParPiste 50
tailleSecteur 512
nbSecteursParBloc 5
27/02/22 © Robert Godin. Tous droits réservés 20
Calcul d ’adresse relative du premier secteur d ’un bloc
noSecteurRelatif (105)
– = noBloc (21) nbSecteursParBloc (5)
noBloc noSecteurRelatif noPiste noSurface noSecteur
0 0-4 0 0 0-4
1 5-9 0 0 5-9
2 10-14 0 0 10-14
3 15-19 0 0 15-19
... ... ... ... ...
9 45-49 0 0 45-49
10 50-54 0 1 0-4
11 55-59 0 1 5-9
... ... ... ... ...
20 100-104 0 2 0-4
21 105-109 0 2 5-9
... ... ... ... ...
190 950-954 0 19 0-4
191 955-959 0 19 5-9
... ... ... ... ...
200 1000-1004 1 0 0-4
201 1005-1009 1 0 5-9
... ... ... ... ...
Paramètre Valeur
nbSurfaces 20
nbCylindres 1000
nbSecteursParPiste 50
tailleSecteur 512
nbSecteursParBloc 5
Calcul de l ’adresse physique du premier secteur du bloc
noCylindre (0) = noSecteurRelatif (105) DIV nbSecteursParCylindre (1000)
où nbSecteursParCylindre (1000) = nbSecteursParPiste (50) nbSurfaces (20)
noSurface (2) = (noSecteurRelatif (105) MOD nbSecteursParCylindre (1000)) DIV nbSecteursParPiste (50)
noSecteur (5) = (noSecteurRelatif (105) MOD nbSecteursParCylindre (1000)) MOD nbSecteursParPiste (50)
noBloc noSecteurRelatif noCylindre noSurface noSecteur
0 0-4 0 0 0-4
1 5-9 0 0 5-9
2 10-14 0 0 10-14
3 15-19 0 0 15-19
... ... ... ... ...
9 45-49 0 0 45-49
10 50-54 0 1 0-4
11 55-59 0 1 5-9
... ... ... ... ...
20 100-104 0 2 0-4
21 105-109 0 2 5-9
... ... ... ... ...
190 950-954 0 19 0-4
191 955-959 0 19 5-9
... ... ... ... ...
200 1000-1004 1 0 0-4
201 1005-1009 1 0 5-9
... ... ... ... ...
Paramètre Valeur
nbSurfaces 20
nbCylindres 1000
nbSecteursParPiste 50
tailleSecteur 512
nbSecteursParBloc 5
27/02/22 © Robert Godin. Tous droits réservés 22
7.3.1 Allocation d'espace contigu
Allocation en vrac à la création du fichier
Croissance de la taille du fichier ???
Fragmentation externe
F i c h i e r A F i c h i e r B F i c h i e r C F i c h i e r D
Mieuxajusté
F i c h i e r A F i c h i e r B F i c h i e r C F i c h i e r D
Premierajusté
7.3.2 Allocation dynamique d'espace par granule
Granule d'allocation d'espace (segment, cluster, extent)
–
unité d'allocation d'espace
–
ensemble de blocs consécutifs
Fragmentation du fichier (file fragmentation)
A B C
D A B B B C D B
A B C
D D A B B B B C
Défragmentation
27/02/22 © Robert Godin. Tous droits réservés 24
Table d'allocation des
fichiers (file allocation table - FAT)
B lo c 0 d u F i c h ie r A B lo c 1 d u F i c h ie r A B lo c 0 d u F i c h ie r B B lo c 1 d u F i c h ie r B
B l o c li b r e B l o c li b r e B lo c 5 d u F i c h ie r A B lo c 0 d u F i c h ie r C B lo c 1 d u F i c h ie r C
B l o c li b r e 1 0
1 1 1 2 1 3 1 4 1 5 1 6 1 7 1 8 1 9 N u m é r o d e b lo c
d u d i s q u e
B lo c 2 d u F i c h ie r A B lo c 3 d u F i c h ie r A B lo c 4 d u F i c h ie r A B lo c 2 d u F i c h ie r B B lo c 3 d u F i c h ie r B 2 0
2 1 2 2 2 3 2 4
1 1
N o m d u f ic h i e r
N u m é r o d u p r e m i e r b l o c
A 1 0
B 1 2
C 1 7 2 0
1 3 2 3
N i l 1 0 N i l
2 1 2 2 1 6 2 4 N i l
D i s q u e o r g a n i s é p a r b l o c T a b l e d ' a l l o c a t i o n
d e s fic h i e r s
1 0 1 1 1 2 1 3 1 4 1 5 1 6 1 7 1 8 1 9 2 0 2 1 2 2 2 3 2 4
Ex: granule = 1 bloc
Style DOS
Allocation d ’espace chaînée
Chargée en mémoire centrale
Organisations plus
sophistiquées pour la table d ’allocation
UNIX, NTFS
– structure arborescente
Stratégie des frères jumeaux (buddy system)
– granules d'allocation d'espace de taille 2
n– fusion/division de granules voisins
(jumeaux)
27/02/22 © Robert Godin. Tous droits réservés 26
Couches de base
Niveau 1 Opérations sur secteurs
Niveau 2 Opérations sur blocs
Niveau 3 Opérations sur hiérarchie de répertoires et fichiers organisés par
blocs
7.3.3Optimisation du déplacement du bras de lecture/écriture
Algorithme de l'ascenseur (“SCAN”)
Algorithme de balayage circulaire (“ C-SCAN ”)
Temps
Temps
27/02/22 © Robert Godin. Tous droits réservés 28
7.3.4 Taille optimale de bloc
Grande taille =>
– effet de grappe
– données transférées inutilement
– gaspillage d ’espace pour petits fichiers
Compromis
– 2K, 4K, 8K pour applications traditionnelles
– >> pour entrepôt de données, multimédia
7.3.5 Antémémoire (cache memory )
Mémoire intermédiaire
Données fréquemment utilisées
Réduire le temps moyen
Antémémoire disque (disk cache)
– réalisée en mémoire centrale afin
d'accélérer les entrées/sorties sur un
disque
27/02/22 © Robert Godin. Tous droits réservés 30
Principe de l ’ antémémoire
D i s q u e
B l o c 0
B l o c 5 B l o c 1
B l o c 6 B l o c 2
B l o c 7 B l o c 3
B l o c 8 B l o c 4
B l o c 9
T a m p o n s y s t è m e
B l o c 4
M é m o i r e p r i m a ir e
1 e r
T a m p o n p r o c e s s u s # 1
B l o c 4 2 e
T a m p o n p r o c e s s u s # 2
B l o c 4
3 e
Antémémoire
Gestionnaire de l'antémémoire disque (“disk cache manager ”)
D is q u e
2 0 B l o c 4
B l o c 2 0
B l o c 7 0
B l o c 5 0
B l o c 0
B l o c 5 B l o c 1
B l o c 6 B l o c 2
B l o c 7 B l o c 3
B l o c 8 B l o c 4
B l o c 9
n o B l o c
4 5 7
S
R é p e r t o i r e d e
l 'a n t é m é m o ir e A n t é m é m o i r e
M é m o i r e p r im a i r e
T a m p o n
27/02/22 © Robert Godin. Tous droits réservés 32
Écriture en antémémoire
D is q u e
2 0 B l o c 4
B l o c 2 ' 1
B l o c 7 0
B l o c 5 0
B l o c 0
B l o c 5 B l o c 1
B l o c 6 B l o c 2
B l o c 7 B l o c 3
B l o c 8 B l o c 4
B l o c 9
n o B lo c
4 5 7
S
R é p e r t o ir e d e
l 'a n t é m é m o ir e A n t é m é m o i r e
M é m o i r e p r im a i r e T a m p o n
p r o c e s s u s # 1
B l o c 2 '
T a m p o n
Sélection d ’une victime
Processus #1: lire Bloc 3 et antémémoire pleine !
Choix d ’une victime pour remplacement: Bloc 2 ’ qui est sale (s = 1)
Évacuation de la victime
2 0 B l o c 4
B l o c 2 ' 1
B l o c 7 0
B l o c 5 0
B l o c 0
B l o c 5 B l o c 1
B l o c 6 B l o c 2 '
B l o c 7 B l o c 3
B l o c 8 B l o c 4
n o B l o c
4 5 7
S
R é p e r t o i r e d e
l'a n t é m é m o i r e A n t é m é m o ir e
T a m p o n p r o c e s s u s # 1
T a m p o n
1er
27/02/22 © Robert Godin. Tous droits réservés 34
Remplacement de la victime
D is q u e
3 0 B l o c 4
B l o c 3 0
B l o c 7 0
B l o c 5 0
B l o c 0
B l o c 5 B l o c 1
B l o c 6 B l o c 2 '
B l o c 7 B l o c 3
B l o c 8 B l o c 4
B l o c 9
n o B lo c
4 5 7
S
R é p e r t o ir e d e
l'a n t é m é m o ir e A n t é m é m o ir e
M é m o i r e p r im a i r e T a m p o n
p r o c e s s u s # 1
B l o c 3
T a m p o n
2 e
3 e
Stratégie de remplacement
Maximiser la probabilité d ’accès en antémémoire
Remplacer le tampon le moins récemment utilisé (Least Recently Used (LRU))
Remplacer le tampon le moins
fréquemment utilisé (Least Frequently
Used (LFU))
27/02/22 © Robert Godin. Tous droits réservés 36
Hiérarchie de mémoire
Hierarchical Storage Management
– migration automatique entre niveaux
– contrôlée par paramètres de configuration
Primaire
Secondaire
Tertiaire
Capacité Vitesse
d'accès Coût
7.4 Fichiers en Java (java.io)
Accès sériel (stream)
Accès direct (random access)
I n p u t S t r e a m u n I n p u t S t r e a m ;
u n O c t e t
u n O c t e t = u n I n p u t S t r e a m . r e a d ( ) ;
u n O u t p u t S t r e a m . w r i t e ( u n O c t e t ) ; O u t p u t S t r e a m u n O u t p u t S t r e a m ; P r o g r a m m e
J a v a p o s i t i o n c o u r a n t e
1 2
p o s i t i o n c o u r a n t e d e l a f i n d u S t r e a m
1
2
27/02/22 © Robert Godin. Tous droits réservés 38
Cache le niveau bloc
N i v e a u 1
O p é r a t i o n s s u r s e c t e u r s N i v e a u 2
O p é r a t i o n s s u r b l o c s N i v e a u 3
O p é r a t i o n s s u r h i é r a r c h i e d e r é p e r t o i r e s e t f i c h i e r s o r g a n i s é s p a r
b l o c s N i v e a u 4
O p é r a t i o n s s u r h i é r a r c h i e d e r é p e r t o i r e s e t f i c h i e r s o r g a n i s é s p a r
o c t e t s
(I n p u t S t r e a m , O u t p u t S t r e a m )
java.io.InputStream
ObjectInputStream BufferedInputStream
FilterInputStream ByteArrayInputStream
InputStream
DataInput
<<Interface>>
DataInputStream
FileInput Stream
LineNumberInputStream PipedInput
Stream
PushbackInputStream SequenceInputStream
StringBufferInputStream
27/02/22 © Robert Godin. Tous droits réservés 40
java.io.OutputStream
Buf fe redO utp utSt ream
Fil terOutput Stream ByteArrayOutputStream
OutputStream
DataOutput
<<Interface>>
Dat aOutput Stream FileOutpu tStream
ObjectOutput
<<Interface>>
Ob jectOutp utSt ream
PipedOutputStream
PrintS tream
java.io.RandomAccessFIle
Dat aOutp ut
<<Interface>>
Dat aInp ut
<<Interface>>
RandomAccessFile
27/02/22 © Robert Godin. Tous droits réservés 42
Lecture des octets d’un fichier
/ * Lit un fichier et en compte le nombre d'octets */
package LivreJava;
import java.io.*;
public class CompterOctetsFichier{
public static void main (String args[]) { int unOctet;
int compteurOctet;
FileInputStream unFichier;
try{
unFichier = new FileInputStream("C:/ forte4j/ Development/ LivreJava/ Fichier1.txt");
compteurOctet = 0;
while((unOctet = unFichier.read()) != -1) compteurOctet++;
unFichier.close();
System.out.println("Nombre d'octets du fichier Fichier1.txt : "+compteurOctet);
}
catch (IOException e){
System.err.println("Exception\ n" + e.toString());
}
}
}
/ * Création d'un fichier et écriture d'un entier sous forme d'une suite d'octets dans le fichier */
package LivreJava;
import java.io.*;
public class EcrireEntierEnOctets{
public static void main (String args[]) { FileOutputStream unFichier;
try{
unFichier = new FileOutputStream("C:/ forte4j/ Development/ LivreJava/ Octets.dat");
int unEntier = 1629696561;/ / (97*2^24)+(35*2^16)+(50*2^8)+49 = "a#21" en String;
/ / Convertir unEntier en un tableau de 4 octets byte[] tampon = new byte[4];
for (int i = 3; i>=0;i--){
tampon[i] = (byte)(unEntier & 0XFF); / / Extrait l'octet le moins significatif unEntier >>>=8; / / Décalage de 8 bits (remplissage à 0)
}
unFichier.write(tampon);
unFichier.close();
}
catch (IOException e){
7.4.1 Ecriture et lecture d'un entier dans un
fichier sous forme binaire (FileOutputStream,
FileInputStream)
27/02/22 © Robert Godin. Tous droits réservés 44
/ * Lecture dans le fichier d'un entier sous forme d'une suite d'octets et conversion en int */
package LivreJava;
import java.io.*;
public class LireEntierEnOctets{
public static void main (String args[]) { FileInputStream unFichier;
try{
unFichier = new FileInputStream("C:/ forte4j/ Development/ LivreJava/ Octets.dat");
byte[] tampon = new byte[4];
unFichier.read(tampon); / / Lecture des 4 octets
/ / Convertir le tableau d'octets tampon en int unEntier int unEntier=0;
for (int i = 0; i<=3;i++){
unEntier <<=8;
unEntier +=((int) tampon[i])&0XFF;
}
unFichier.close();
System.out.println("Valeur décimale de l'entier : "+unEntier);
}
catch (IOException e){
System.err.println("Exception\ n" + e.toString());
}
}
}
7.4.2 Classes DataInputStream et DataOutputStream
DataInputStream DataInputStream(arg0 : InputStream) read(arg0 : byte[]) : int
read(arg0 : byte[], arg1 : int, arg2 : int) : int readFully(arg0 : byte[]) : void
readFully(arg0 : byte[], arg1 : int, arg2 : int) : void skipBytes(arg0 : int) : int
readBoolean() : boolean readByte() : byte
readUnsignedByte() : int readShort() : short
readUnsignedShort() : int readChar() : char
readInt() : int readLong() : long readFloat() : float readDouble() : double readLine() : String readUTF() : String
DataOutputStream
DataOutputStream(arg 0 : OutputStream) write(arg0 : int) : void
write(arg0 : byte[], arg1 : int, a rg2 : i nt) : void flush() : voi d
writeBoolean(arg0 : bo ole an) : void writeByte(arg0 : int) : void
writeShort(arg0 : int) : void writeChar(arg0 : int) : void writeInt(arg0 : int) : void writeLong(arg0 : long) : vo id writeFloat(arg0 : float) : void writeDoubl e(arg0 : double) : void writeBytes(arg0 : String) : voi d writeChars(arg0 : String) : void writeUTF(arg0 : String) : void size() : int
27/02/22 © Robert Godin. Tous droits réservés 46
Ecriture d ’un int
/ * Création d'un DataOutputStream à partir d'un fichier et écriture d'un entier dans le fichier */
package LivreJava;
import java.io.*;
public class EcrireEntier{
public static void main (String args[]) { DataOutputStream unFichier;
try{
unFichier =
new DataOutputStream(
new FileOutputStream("C:/ forte4j/ Development/ LivreJava/ UnEntier.dat"));
int unEntier = 1629696561;/ / (97*2^24)+(35*2^16)+(50<<2^8)+49 = "a#21" en String;
unFichier.writeInt(unEntier);
unFichier.close();
}
catch (IOException e){
System.err.println("Exception\ n" + e.toString());
}
}
}
Lecture du int
/ * Lecture dans le fichier d'un entier à l'aide d'un DataInputStream */
package LivreJava;
import java.io.*;
public class LireEntier{
public static void main (String args[]) { DataInputStream unFichier;
try{
unFichier =
new DataInputStream(
new FileInputStream("C:/ forte4j/ Development/ LivreJava/ UnEntier.dat"));
int unEntier = unFichier.readInt();
unFichier.close();
System.out.println("Valeur décimale de l'entier : "+unEntier);
}
catch (IOException e){
System.err.println("Exception\ n" + e.toString());
}
27/02/22 © Robert Godin. Tous droits réservés 48
7.4.3 Fichiers de type texte
BufferedWrite r
Writer
CharArrayWriter
FileWriter OutputStreamWriter FilterWriter PipedWri ter PrintWriter StringWriter
BufferedReader
Reader
CharArrayReader
FileReader
InputStreamReader FilterReader
LineNumberReader
PipedReader
PushbackReader StringReader
Écrire du texte
/ * Création d'un FileWriter à partir d'un fichier et écriture d'un entier dans le fichier sous forme d'une chaîne de caractères */
package LivreJava;
import java.io.*;
public class EcrireEntierTexte{
public static void main (String args[]) { FileWriter unFichier;
try{
unFichier =
new FileWriter("C:/ forte4j/ Development/ LivreJava/ UnEntier.txt");
unFichier.write("1629696561");
unFichier.close();
}
catch (IOException e){
System.err.println("Exception\ n" + e.toString());
}
27/02/22 © Robert Godin. Tous droits réservés 50
PrintWriter : conversion en texte
/ * Création d'un PrintWriter à partir d'un fichier et écriture d'un entier dans le fichier sous forme d'une chaîne de caractères */
package LivreJava;
import java.io.*;
public class EcrireEntierTextePrintWriter{
public static void main (String args[]) { PrintWriter unFichier;
try{
unFichier =
new PrintWriter(
new FileWriter("C:/ forte4j/ Development/ LivreJava/ UnEntierPW.txt"));
unFichier.print(1629696561);
unFichier.close();
}
catch (IOException e){
System.err.println("Exception\ n" + e.toString());
}
}
}
PrintStream et PrintWriter
PrintStream PrintStream(arg0 : OutputStream)
PrintStream(arg0 : OutputStream, arg1 : boolean) flush() : void
close() : void
checkError() : boolean setError() : void write(arg0 : int) : void
write(arg0 : byte[], arg1 : int, arg2 : int) : void print(arg0 : boolean) : void
print(arg0 : char) : void print(arg0 : int) : void print(arg0 : long) : void print(arg0 : float) : void print(arg0 : double) : void print(arg0 : char[]) : void print(arg0 : String) : void print(arg0 : Object) : void println() : void
println(arg0 : boolean) : void println(arg0 : char) : void println(arg0 : int) : void println(arg0 : long) : void println(arg0 : float) : void println(arg0 : double) : void println(arg0 : char[]) : void println(arg0 : String) : void println(arg0 : Object) : void
PrintWriter PrintWriter(arg0 : Writer)
PrintWriter(arg0 : Writer, arg1 : boolean) PrintWriter(arg0 : OutputStream)
PrintWriter(arg0 : OutputStream, arg1 : boolean) flush() : void
close() : void
checkError() : boolean setError() : void write(arg0 : int) : void
write(arg0 : char[], arg1 : int, arg2 : int) : void write(arg0 : char[]) : void
write(arg0 : String, arg1 : int, arg2 : int) : void write(arg0 : String) : void
print(arg0 : boolean) : void print(arg0 : char) : void print(arg0 : int) : void print(arg0 : long) : void print(arg0 : float) : void print(arg0 : double) : void print(arg0 : char[]) : void print(arg0 : String) : void print(arg0 : Object) : void println() : void
println(arg0 : boolean) : void println(arg0 : char) : void println(arg0 : int) : void println(arg0 : long) : void
27/02/22 © Robert Godin. Tous droits réservés 52
Lire du texte
/ * Lecture dans le fichier d'un entier sous forme de texte à l'aide d'un FileReader */
package LivreJava;
import java.io.*;
public class LireEntierTexte{
public static void main (String args[]) { FileReader unFichier;
try{
char[] tableauChar = new char[10];
unFichier = new FileReader("C:/ forte4j/ Development/ LivreJava/ UnEntier.txt");
unFichier.read(tableauChar,0,10);
int unEntier = Integer.parseInt(new String(tableauChar,0,10));
unFichier.close();
System.out.println("Valeur décimale de l'entier : "+unEntier);
}
catch (IOException e){
System.err.println("Exception\ n" + e.toString());
}
}
}
7.4.4 Représentation interne des caractères et traitement des fins de ligne
01100001 01100010 01100011 00001101 00001010 00110001 00110010 00001101 00001010 a b c \r \n 1 2 \r \n
Jeu de caractères ASCII 8 bits
27/02/22 © Robert Godin. Tous droits réservés 54
7.4.5 Analyse lexicale avec la classe StreamTokenizer
… FileReader unFichier = new FileReader("C:/ forte4j/ Development/ LivreJava/ Plants.txt");
StreamTokenizer unStreamTokenizer = new StreamTokenizer(unFichier);
… while(unStreamTokenizer.nextToken()!= StreamTokenizer.TT_EOF){/ / fin du fichier ? / / Lecture du noPlant
if(unStreamTokenizer.ttype == StreamTokenizer.TT_NUMBER){/ / Est-ce bien un nombre ? noPlant = (int) unStreamTokenizer.nval; / / nval est un double !
} else
{System.out.println("Le format du fichier est incorrect : noPlant attendu"); System.exit(1);}
/ / Lecture de la description unStreamTokenizer.nextToken();
if(unStreamTokenizer.ttype == (int)'"'){/ / Est-ce bien une chaîne encadrée par " ? description = unStreamTokenizer.sval;
} else
{System.out.println("Le format du fichier est incorrect : description attendue"); System.exit(1);}
/ / Lecture du prixUnitaire unStreamTokenizer.nextToken();
if(unStreamTokenizer.ttype == StreamTokenizer.TT_NUMBER){/ / Est-ce bien un nombre ? prixUnitaire = unStreamTokenizer.nval;
} else
{System.out.println("Le format du fichier est incorrect : prix attendu"); System.exit(1);}
… }
…
7.4.6 Traitement d'un document XML avec SAX et DOM
<?xml version="1.0" encoding="ISO-8859-1"
standalone="yes"?>
<!DOCTYPE Catalogue [
<!ELEMENT Catalogue (Plant+)>
<!ELEMENT Plant (noPlant,description,prixUnitaire)>
<!ELEMENT noPlant (#PCDATA)>
<!ELEMENT description (#PCDATA)>
<!ELEMENT prixUnitaire (#PCDATA)>
]>
<Catalogue>
<Plant>
<noPlant>10</ noPlant>
<description>Cèdre en boule</ description>
<prixUnitaire>10.99</ prixUnitaire>
</ Plant>
<Plant>
<noPlant>20</ noPlant>
<description>Sapin</ description>
<prixUnitaire>12.99</ prixUnitaire>
</ Plant>
<Plant>
<noPlant>40</ noPlant>
<description>Epinette bleue</ description>
<prixUnitaire>25.99</ prixUnitaire>
27/02/22 © Robert Godin. Tous droits réservés 56 / ** * Création d'un arbre DOM avec JAXP
* Parcours de l'arbre pour extraire les données et les insérer * dans le vecteurs d'objets Plant
*/
package LivreJava;
/ / Packages de JAXP import javax.xml.parsers.*;
import org.xml.sax.*;
import org.xml.sax.helpers.*;
import org.w3c.dom.*;
import java.io.*;
import java.util.*;
public class ExempleJAXPPlants {
public static void main(String[] args) throws Exception {
/ / Création d'un DocumentBuilderFactory et configuration des paramètres
DocumentBuilderFactory unDocBuildFact = DocumentBuilderFactory.newInstance();
unDocBuildFact.setValidating(true);
unDocBuildFact.setIgnoringElementContentWhitespace(true);
/ / Création d'un DocumentBuilder
DocumentBuilder unDocumentBuilder = unDocBuildFact.newDocumentBuilder();
/ / Parsage du document Document unDocument =
unDocumentBuilder.parse("C:/ forte4j/ Development/ LivreJava/ Plants.xml");
Vector vecteurDePlants = new Vector();
Node unElementCatalogue = unDocument.getDocumentElement(); / / Cherche l'élément racine <catalogue>
/ / Itérer sur les noeuds <Plant> qui sont les enfants de <Catalogue>
NodeList listeNodePlants = unElementCatalogue.getChildNodes();
int tailleListe = listeNodePlants.getLength();
for (int i = 0; i < tailleListe ; i++) {
Node unNodePlant = listeNodePlants.item(i); / / ELEMENT <Plant>
Node unNodeNoPlant = unNodePlant.getFirstChild(); / / ELEMENT <noPlant>
/ / la valeur est dans le premier enfant
int noPlant = Integer.parseInt(unNodeNoPlant.getFirstChild().getNodeValue());
Node unNodeDescription = unNodeNoPlant.getNextSibling(); / / ELEMENT <description>
String description = unNodeDescription.getFirstChild().getNodeValue();
Node unNodePrixUnitaire = unNodeDescription.getNextSibling(); / / ELEMENT <prixUnitaire>
double prixUnitaire = Double.parseDouble(unNodePrixUnitaire.getFirstChild().getNodeValue());
Plant unPlant = new Plant(noPlant, description, prixUnitaire);
System.out.println(noPlant + " " + description + " " + prixUnitaire);
vecteurDePlants.addElement(unPlant);
} } }
27/02/22 © Robert Godin. Tous droits réservés 58
7.4.7 Utilisation de la classe java.io.File
Vérifier l ’existence d ’un fichier
package LivreJava;
import java.io.*;
import javax.swing.JOptionPane;
public class VerifierExistenceFichier { public static void main (String args[]) { FileOutputStream unFichier;
try{
File leFile = new File("C:/ forte4j/ Development/ LivreJava/ Octets.dat");
if (leFile.exists()){
String reponse =
JOptionPane.showInputDialog("Voulez-vous détruire le contenu existant (oui ou non)?");
if(reponse == "non"){
System.out.println("Le fichier demeure tel quel");
System.exit(0);
} }
unFichier = new FileOutputStream(leFile);
Créer un répertoire
package LivreJava;
import java.io.*;
public class CreerRepertoire{
public static void main (String args[]) throws Exception {
File unFile = new File("C:/ forte4j/ Development/ DossierA/ DossierB/ ");
unFile.mkdirs();
if(unFile.exists()){System.out.println("Il a été créé");}
else{System.out.println("Il n'a pas été créé");}
}
}
27/02/22 © Robert Godin. Tous droits réservés 60
7.4.8 Dialogue de sélection de fichier avec la classe JFileChooser
package LivreJava;
import java.io.*;
import javax.swing.*;
public class CreerFichierFileChooser extends JFrame { public CreerFichierFileChooser () throws Exception { JFileChooser unFileChooser = new JFileChooser();
unFileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
int résultat = unFileChooser.showSaveDialog(this);
if (résultat != JFileChooser.CANCEL_OPTION){
File leFile = unFileChooser.getSelectedFile();
if (leFile != null && !(leFile.getName().equals(""))){
FileOutputStream unFichier = new FileOutputStream(leFile);
7.5Organisation par enregistrements
Enregistrement (record ), champ (field )
TYPE PlantCatalogue = ENREGISTREMENT
noCatalogue : ENTIER;
description : CHAINE[30];
prixUnitaire : REEL;
FIN.
noCatalogue description prixUnitaire
10 Cèdre en boule 10.99
20 Sapin 12.99
40 Epinette bleue 25.99
50 Chêne 22.99
60 Erable argenté 15.99
70 Herbe à puce 10.99
80 Poirier 26.99
81 Catalpa 25.99
27/02/22 © Robert Godin. Tous droits réservés 62
Niveau 4 : enregistrement
N i v e a u 1
O p é r a t i o n s s u r s e c t e u r s N i v e a u 2
O p é r a t i o n s s u r b l o c s N i v e a u 3
O p é r a t i o n s s u r h i é r a r c h i e d e r é p e r t o i r e s e t f i c h i e r s o r g a n i s é s p a r
b l o c s N i v e a u 4
O p é r a t i o n s s u r h i é r a r c h i e d e r é p e r t o i r e s e t f i c h i e r s o r g a n i s é s p a r
e n r e g i s t r e m e n t s
Méthode et chemin d ’accès
Méthode d'accès (access method) ou mode d'accès
– manière d'accéder d'un point de vue logique
sériel, séquentiel, sélection par clé, par intervalle
Chemin d'accès (access path)
– chemin dans les structures de données
27/02/22 © Robert Godin. Tous droits réservés 64
Méthode d'accès sériel
Patron d ’itérateur
Ordre => séquentiel
PremierEnregistrement ( TypeEnregistrement , TamponEnregistrement , …) TANT QUE pas la fin de la collection
traitement d'un enregistrement
EnregistrementSuivant ( TypeEnregistrement , TamponEnregistrement ,…)
FIN TANT QUE
Méthode d'accès par sélection basée sur un identifiant d'enregistrement
Identifiant d ’enregistrement (IDE)
– accès rapide
SélectionnerEnregistrement ( IDE , TamponEnregistrement ) Entrée : IDE
Sortie : TamponEnregistrement
CréerEnregistrement ( IDE , TamponEnregistrement ) Entrée : TamponEnregistrement
IDE sera une entrée ou une sortie selon le cas ModifierEnregistrement ( IDE , TamponEnregistrement )
Entrée : IDE, TamponEnregistrement
SupprimerEnregistrement ( IDE )
27/02/22 © Robert Godin. Tous droits réservés 66
Méthode d'accès par sélection basée sur une clé d'accès
Clé d'accès (access key)
– champ ou combinaison de champs utilisés comme critère de sélection
Clé simple/composée
Clé unique (unique key)
Sélection par intervalle
Méthode d ’accès multidimensionnelle
7.5.1 Organisation primaire et secondaire
Organisation primaire (primary organization)
–
placement des enregistrements
sériel, séquentiel, index primaire, hachage, grappe, ...
–
gestion des IDE
Organisation secondaire (secondary organization )
–
liste , arbre, index secondaire, etc.
–
référence aux IDE
27/02/22 © Robert Godin. Tous droits réservés 68
Fichier homogène (homogeneous) ou hétérogène (heterogeneous)
Niveau 4 : SGF ou SGBD ?
7.5.4 Alternatives de réalisation de l'IDE
idFichier, NER
l'adressage relatif
(e.g. organisation “relative” de NON STOP SQL)
l'indexage
(e.g. organisation “key sequenced” sur “SYSKEY” de NON STOP SQL)
idFfichier, #bloc, #séquence (e.g. DBKEY DBMS-32 (CODASYL), ROWID ORACLE).
idFichier, #bloc, #octet (e.g. “entry-sequenced” de NON STOP SQL)
idFichier, clé unique (e.g. “key-sequenced” de NON STOP SQL, logical ROWID de ORGANIZATION INDEX Oracle 8)
IDE logique
(e.g. OID dans les SGBDO)
27/02/22 © Robert Godin. Tous droits réservés 70
7.5.5 Représentation interne des enregistrements
Enregistrements => blocs
Taille fixe ou variable
7.4.5.1Enregistrements de taille fixe
Chaque champ => nombre fixe d ’octets
Remplissage par caractère neutre
T o t a l : 4 2 o c t e t s d e s c r ip t io n
C H A I N E [ 3 0 ]
u n o c t e t ( A S C I I 8 b it s ) p a r c a r a c t è r e ( r e m p lis s a g e a v e c e s p a c e s ) ( 3 0 o c t e t s )
p r ix U n it a ir e R E E L
p o in t - f lo t t a n t 6 4 b it s ( 8 o c t e t s ) n o C a t a lo g u e
E N T I E R b in a ir e 3 2 b it s
( 4 o c t e t s )
27/02/22 © Robert Godin. Tous droits réservés 72
7.4.5.2Enregistrements de taille variable
Frontières de champs et d ’enregistrements
indicateur de taille en entête de chaque champ (descripteur de champ)
délimiteur (code réservé)
index en entête de l'enregistrement (descripteur d'enregistrement)
d e s c r ip t io n p r ix U n it a ir e
n o C a t a lo g u e
t a ille N o C a t a lo g u e t a ille D e s c r ip t io n t a ille P r ix U n it a ir e
d e s c r ip t io n p r ix U n it a ir e
n o C a t a lo g u e
description prixUnitaire
noCatalogue
7.6Adressage relatif
Allocation d'espace sérielle (serial space allocation)
– avec/sans chevauchement de bloc
Facteur de blocage (FB, blocking factor)
– nombre d'enregistrements par bloc
Numéro de bloc = NER / FB
Position relative dans le bloc =
– NER MOD FB taille d'un enregistrement
NER = champ ?
IDE = idFichier, NER
Gros enregistrement : chevauchement
N u m é r o d e b l o c
N u m é r o d 'e n r e g i s t r e m e n t
r e l a t i f
0
1
2
0 1 2 3 4
5 6 7 8 9
1 0 1 1 1 2
E s p a c e p e r d u
27/02/22 © Robert Godin. Tous droits réservés 74
Liste des espaces libres (free list)
P o i n t e u r s u rp r e m i e r e s p a c e l i b r e
E s p a c e l i b r e
E s p a c e l i b r e
E s p a c e l i b r e E s p a c e l i b r e
E s p a c e l i b r e
0 1 2 3 4
5 6 7 8 9
1 0 1 1 1 2 1 3 1 4
B l o c r é s e r v é à
l ' e n t ê t e d e f i c h i e r
7.7 Allocation d'espace pour les enregistrements de taille variable
Analogue à l ’allocation d ’espace pour les fichiers
Granularité plus fine
27/02/22 © Robert Godin. Tous droits réservés 76
7.7.1 Allocation sérielle pour enregistrements de taille variable
Gestion d ’espace libre
– ne pas récupérer
– liste libre
mieux ajusté
premier ajusté
Fragmentation interne au fichier
IDE = idFichier, #bloc, #octet
– enregistrement cloué
0 N u m é r o
d e b l o c
1
2
7.7.2 Récupération d'espace et adressage structuré par bloc
IDE = idFichier, #bloc, #séquence ( clouage partiel)
Suppression de #2
3 Espace libre Enr. #3 Enr. #2 Enr. #1
Taille de l'index des positions
1 2 3
Index des positions des enregistrements
27/02/22 © Robert Godin. Tous droits réservés 78
7.7.3Gestion des débordements
Même IDE
Oracle : PCTFREE
B l o c d 'a n c r a g e
B l o c d e d é b o r d e m e n t
B lo c v i r t u e l d e t a i ll e v a r i a b le
0 N u m é r o
d e b l o c
1
2
Découpage de l ’enregistrement
2 e m o r c e a u B lo c
d 'a n c r a g e
B l o c d e d é b o r d e m e n t
0 N u m é r o
d e b l o c
1
2
1 e r m o r c e a u
27/02/22 © Robert Godin. Tous droits réservés 80
7.7.4 Adressage logique
IDE découplé de sa position physique
Souplesse d ’allocation d ’espace
–
Ex: OID dans les BD objet
M é c a n i s m e d e t r a d u c t i o n ( e . g . i n d e x ) I D El o g i q u e
a d r e s s e p h y s i q u e
7.7.5 Découpage en morceaux de taille fixe
Découper un enregistrement de taille variable en morceaux de taille fixe
Allocation des morceaux par
adressage relatif
27/02/22 © Robert Godin. Tous droits réservés 82
7.7.6Allocation d'espace pour gros enregistrements de taille variable
Allocation chevauchante
– blocs consécutifs
– diminuer le nombre de positionnements
Réalisation de l ’IDE
– adressage logique
– adresse de suivi
7.7.7Allocation hybride pour les enregistrements de taille variable
Organisations spécialisées selon la taille des champs
– un mécanisme pour petits champs
– un autre pour les gros champs
référence externe (e.g. chemin, URL)
27/02/22 © Robert Godin. Tous droits réservés 84
7.8Allocation sérielle par grappe homogène
Grappe (cluster)
–
ensemble d ’enregistrements regroupés physiquement
Clé de la grappe (cluster key)
–
critère de regroupement
–
ensemble de champs
Identifiant de grappe (IDG, cluster identifier)
–
IDG = #bloc, valeur de la clé de grappe
Exemple : insertion avec idMembre = 2
idMembre datePrêt idExemplaire
2 15/ 08/ 2000 75
3 16/ 08/ 2000 200
1 17/ 08/ 2000 100
4 18/ 08/ 2000 400
2 19/ 08/ 2000 50
1 20/ 08/ 2000 300
3 21/ 08/ 2000 150
2 1 5 / 0 8 / 2 0 0 0 7 5
0
3 1 6 / 0 8 / 2 0 0 0 2 0 0
1 1 7 / 0 8 / 2 0 0 0 1 0 0
4 1 8 / 0 8 / 2 0 0 0 4 0 0
N u m é r o
d e b l o c I D G = # b l o c , c l é d e g r a p p e
0 , 2 0 , 3 0 , 1 0 , 4
0
3 1 6 / 0 8 / 2 0 0 0 2 0 0
1 1 7 / 0 8 / 2 0 0 0 1 0 0
4 1 8 / 0 8 / 2 0 0 0 4 0 0
N u m é r o
d e b l o c I D G
0 , 3 0 , 1 0 , 4
2 1 5 / 0 8 / 2 0 0 0 7 5
2 1 9 / 0 8 / 2 0 0 0 5 0
0 , 2