Manipulation des fichiers en Java TP6 : Pratique

publicité
Manipulation des fichiers en Java
TP6 : Pratique
V.Marangozova-Martin, Ludovic Démontes
1
Objectif du TP
Dans ce TP nous allons implémenter un mécanisme de journalisation que
nous allons attacher à l’allocateur mémoire des précédents TP. L’objectif est de
préserver la cohérence de la mémoire en enregistrant sur un support persistant
(les fichiers) les modifications effectuées sur la structure de gestion. Ainsi, à
chaque fois qu’il y a une allocation ou une libération, les informations concernant
l’opération vont être enregistrées dans un fichier. Si le système tombe en panne
(qui peut être simulé par un Ctrl-C...), il sera possible de le relancer et de le
remettre dans un état cohérent en examinant le contenu du fichier journal (log).
2
Manipulation de fichiers en Java
Java fournit de nombreuses classes qui permettent la manipulation de fichiers. Nous n’allons pas toutes les décrire, vous pouvez les consulter dans l’API.
Pour lire un fichier, il est possible de faire ceci :
import java . io .*;
class read {
public static void main ( String args []) throws IOException {
String thisLine ;
String [] fullText = new String [10];
int counter = 0;
FileInputStream fis = new FileInputStream ( " filename . extention " );
DataInputStream myInput = new DataInputStream ( fis );
while (( thisLine = myInput . readLine ()) != null ) {
System . out . println ( thisLine );
counter ++;
fullText [ counter ] = thisLine ;
}
}
}
Pour écrire dans un fichier, il est possible de faire ceci :
1
Miage3, 2009-2010
2
import java . io .*;
class write {
public static void main ( String args []) throws IOException {
int i ;
String [] text = new String [3];
text [0] = " Hello , ␣ this ␣ is ␣ some ␣ text . " ;
text [1] = " Hello " ;
text [2] = " Hello ␣ World " ;
FileOutputStream fos = new FileOutputStream ( " theText . txt " );
PrintStream myOutput = new PrintStream ( fos );
for ( i = 0; i < 3; i ++) {
myOutput . println ( text [ i ]);
}
}
}
3
Création d’un log
Pour créer un log qui enregistre toutes les opérations d’allocation et de libération, nous allons créer un fichier à l’initialisation de la mémoire. Ensuite,
pour chaque opération, nous allons écrire des informations la concernant dans
ce fichier.
Par exemple, si il y a une opération alloc(10), nous allons écrire dans le
fichier
BEGIN
A 10
Si l’opération réussit, nous allons rajouter END. Ainsi, pour cette opération
le fichier log contiendra :
BEGIN
A 10
END
Si l’opération ne réussit pas, nous allons écrire ABORT. La trace de l’opération
dans le log sera donc :
BEGIN
A 10
ABORT
Question 1 Quelles informations proposez-vous d’enregistrer pour les opérations de libération de mémoire ?
Miage3, 2009-2010
3
Question 2 Si on veut restaurer l’état de la mémoire en utilisant le fichiers
log, comment devrait-on traiter les enregsitrements commençant par BEGIN et
finissant par END ? Et ceux finissant par ABORT ?
Question 3 Implémentez les traitements nécessaires pour la gestion d’un log.
Où allez-vous les insérer dans le code de votre allocateur mémoire ?
Question 4 Simulez le crash de votre système en appuyant sur Ctrl-C. Relancer votre allocateur en restaurant l’état de la mémoire à partir du log. Votre
allocateur devrait pouvoir fonctionner normalement...
Question 5 Dans cette implémentation, le log ne fait que croître. Manipuler un grand fichier va ralentir considérablement votre allocateur. Comment
pourrait-on réduire le log ? Proposer une solution et l’implémenter.
Téléchargement