Manipulation des fichiers en Java TP6 : Pratique
Transcription
Manipulation des fichiers en Java TP6 : Pratique
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.