Les Fichiers


La classe File

La classe File ne sert pas à proprement parler à lire ou à écrire dans un répertoire, mais à accéder à certaines informations d'un fichier désigné par un chemin d'accès, ou à effectuer certaines opérations (e.g. créer un sous-répertoire dans un répertoire donné, effacer un fichier, obtenir la liste des fichiers et sous-répertoires d'un répertoire donné, etc. → voir l'API).
Cette classe fait partie, comme la plupart des classes dont vous aurez besoin pour manipuler des fichiers, du paquet java.io. Pensez donc à importer les classes de ce paquet : import java.io.*;
Pour créer une instance de File, on peut utiliser par exemple son constructeur qui prend en argument la chaîne de caractères contenant son chemin absolu :

      File monFichier = new File ("/tmp/fichierTest.txt");
      System.out.println ("Existe déjà ? " + String.valueOf (monFichier.exists ()));
      monFichier = new File ("/tmp");
      System.out.println ("Existe déjà ? " + String.valueOf (monFichier.exists ()));

      System.out.println("Fichier ? " + String.valueOf(monFichier.isFile()));
      System.out.println("Répertoire ? " + String.valueOf(monFichier.isDirectory()));
		
      File[] listeFichier = monFichier.listFiles();
		
      for (int i = 0; i < listeFichier.length; i++)
      {
          monFichier = listeFichier[i];
	  String typeFich;

	  if (monFichier.isDirectory())
	      typeFich = "[D] ";
	  else
	      typeFich = "[F] ";
			
	  System.out.println(typeFich + monFichier.getAbsolutePath());
      }
    

Écrire dans un fichier texte

Il existe plusieurs types de fichiers et plusieurs manières d'écrire dedans. Nous aborderons ici une des méthodes possibles pour écrire dans un fichier texte. L'ensemble des classes permettant de gérer les flux d'entrée-sortie ne sera pas étudié. Il s'agit de vous donnez une recette pour réaliser, de manière facultative, la partie du projet qui consiste à écrire les résultats de l'extraction des triplets syntaxiques dans un fichier.
Il s'agit de créer une instance de la classe OutputStreamWriter, puis d'écrire dedans via sa méthode write(). Cette classe dispose d'un constructeur qui prend en argument le type d'encodage de caractères de votre fichier ainsi qu'une instance de n'importe quelle classe (concrète) qui étend la classe abstraite OutputStream. Je vous invite à regarder l'API et vous propose la classe FileOutputStream.

      	File monFichier = new File ("/tmp/sortie.txt");
      	FileOutputStream fos = new FileOutputStream(monFichier);
	OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8");
    

Il ne vous reste plus qu'à écrire dans votre fichier. Attention, la méthode write (String) de la classe OutputStreamWriter n'ajoute pas de retour chariot. Il faut ajouter le caractère "\n" si vous le souhaitez.

      	osw.write ("Première ligne\n");
      	osw.write ("Deuxième ligne\n");
    

Attention, une fois terminée l'écriture dans le fichier, il vous faut fermer le flux. Si vous oubliez, le fichier risque d'être vide ou de ne pas contenir tout ce que vous y avez écrit.

      	osw.close ();
    

Si vous observez, dans l'API, le constructeur de la classe OutputStreamWriter, ou la méthode write() de cette classe, vous verrez que leur invocation peut générer des exceptions de type IOException (ou exceptions de classes dérivées). Eclipse refusera d'exécuter le code ci-dessus si vous ne gérez pas ces exceptions.

      File monFichier = new File ("/tmp/sortie.txt");

      try
      {
      	FileOutputStream fos = new FileOutputStream(monFichier);
	OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8");

      	osw.write ("Première ligne\n");
      	osw.write ("Deuxième ligne\n");

        osw.close ();
      }
      catch (IOException e)
      {
        System.out.println ("Pb d'écriture dans le fichier " + monFichier.getAbsolutePath ());
      }      
    

À noter : l'ouverture, l'écriture et la fermeture du fichier peuvent être opérées à des endroits différents dans votre code. Exemple :

  package monPaquet;

  import java.io.*;

  public class FileHelper
  {
        private OutputStreamWriter writer;

	public void openFile (String filePath)
	{
		File monFichier = new File (filePath);

		try
		{
		    FileOutputStream fos = new FileOutputStream(monFichier);
	      	    writer = new OutputStreamWriter(fos, "UTF-8");			
		}
		catch (IOException e)
		{
		    e.printStackTrace();
		    System.out.println("Pb ouveture " + filePath);
		}
	}

	public void writeToFile (String str)
	{
		try
		{			
	      	    writer.write(str);			
		}
		catch (Exception e)
		{
		    e.printStackTrace();
		    System.out.println("Pb ecriture flux (" + str + ")");
		}
	}
	
	public void closeFile ()
	{
		try
		{			
	      	    writer.close ();			
		}
		catch (Exception e)
		{
		    e.printStackTrace();
		    System.out.println("Pb fermeture flux");
		}		
	}

	public static void main (String args[])
  	{
  	    FileHelper helper = new FileHelper ();
	    helper.openFile ("/tmp");
	    // après exécution de openFile, une instance de OutputStreamWriter	
  	    // est créée. Elle est stockée dans le membre writer de l'objet helper

  	    // do sth

  	    helper.writeToFile ("Texte à écrire dans le fichier");

  	    // do sth else

  	    helper.writeToFile ("Autre texte à écrire dans le fichier");

  	    helper.close ();
 	}
    }

    


Retour page séance 8 ]

Mention légale ]