Libgdx Game

dimanche 22 juillet 2012

Tutoriel Libgdx :Les fichiers avec Libgdx #4


---> Introduction
---> Gestion des fichiers
---> Forme de stockage des fichiers
---> Types de fichiers
---> Saisir un fichier
---> Opérations sur les fichiers
---> Conclusion


Introduction :

Nous avons vu dans des tutoriels précédents ce qu’il faut savoir pour commencer à coder avec Libgdx sous Android tout en effectuant  les processus de test et de débogage sur le desktop, ce qui va nous épargner l’utilisation de l’émulateur.
Maintenant que vous savez créer un projet Android/desktop on va commencer à coder.

Gestion des fichiers :

Comme je l’ai dit et comme vous le savez et je le redirais (parce que c’est trop génial !) : Libgdx fonctionne sur plusieurs plateformes ! Et ce qui nous intéresse ici, c’est de programmer sur Android tout en effectuant le test et le débogage sur le desktop.
Libgdx est décomposé en cinq modules et l’un de ces modules est responsable de la gestion des fichiers.
Le module « File » de gestion de fichier fournit un ensemble de méthode qui permettent la manipulation des fichiers .Il prend en charge les taches suivantes :
  • La lecture d'un fichier
  • L’écriture dans un fichier
  • Copier un fichier
  • Déplacer un fichier
  • Lister les fichiers et les répertoires

  
Forme de Stockage des fichiers :

On va commencer par une illustration de la manière avec laquelle les fichiers peuvent être stockés sous desktop puis sous Android :

1)Sous desktop : Les choses sont simples les fichiers peuvent être référencés avec un chemins relative ou avec un chemin absolus.

2)Sous Android : La situation est un peu plus complexe : les fichiers peuvent être stockés dans l’application comme étant des fichiers de ressources et qui doivent obligatoirement se situer dans le fichier assets du projet Android.
Il y aussi le stockage interne, chaque application installée possède son propre répertoire de stockage interne et qui est uniquement accessible par l’application elle-même.
Et sans oublier le stockage externe, telle que la carte SD. Sachant que la carte SD peut ne pas être disponible (le cas où on la retire) donc, les fichiers stockés en interne sont considérés comme étant volatile.

Les types de fichier :

ClassPath :
Les fichiers classpath sont stockés dans le fichier source de votre projet là où les fichiers JAR et les classes compilées sont situées. Ces fichiers sont toujours en lecture seule.
Remarque : Ce genre de fichier est à éviter dès que possibles.

Interne :
* Sous Desktop : Les fichiers internes sont relatifs à l’espace de travail du projet Desktop,
* Sous Android : Les fichiers internes sont relatifs au fichier assets du projet Android.
  Ces fichiers sont en lecture seule.
Remarque : J’ai recommandé dans le tutoriel intitulé tout ce qu'il faut savoir pour commencer avec Libgdx de créer un fichier assets dans le projet desktops et de le lié comme étant une source de fichier interne pour qu’il devient similaire au assets de Android
En vérité, ce n’est pas nécessaire de créer un autre fichier assets dans le projet desktop car vous pouvez lier le fichier  assets de Android, et n’avoir qu’un seul fichier assets pour les deux projets Android et Desktop.

Externe :
* Sous Android : Les fichiers externes sont les fichiers situés dans le répertoire racine de la carte mémoire SD.
* Sous desktop : Les fichiers externes sont les fichiers situés dans le répertoire Home de          l’utilisateur.
Ces fichiers sont en Lecture/Ecriture.

Absolu
Ce sont les fichiers que pour que l’on accède, on doit spécifier le chemin d’accès complet.
Remarque: pour des raisons de portabilité, cette option ne doit être utilisée uniquement que lorsque c’est nécessaire.

Local
* Sous Android : Les fichiers locaux sont les fichiers situés dans le répertoire racine du jeu/app  cdans un dossier privé, cette option a été ajouter récemment et parmi ses avantages c’est que  cces fichiers sont privés pour l’application i.e. si l’application est supprimé ils le seront aussi.
* Sous desktop : les fichiers locaux sont les fichiers situés dans le répertoire de travail du projet cou dans le répertoire racine du jeu/app. Sous desktop, interne et local signifie la même chose.
Les fichiers externes sont en Lecture/Ecriture.

Récapitulant les différents types de fichiers selon le module File :
Type de fichier
Permission de
Android
Desktop
Classpath
Lecture seule
oui
Oui
Interne
Lecture seule
oui
Oui
Externe
Lecture/Ecriture
oui
Oui
Absolu
Lecture/Ecriture
oui
Oui
Local
Lecture/Ecriture
oui
Oui

Saisir un fichier
C’est grâce à la classe FileHande qu’on peut obtenir et gérer les fichiers, La classe FileHandle du package  com.badlogic.gdx.files est indépendante des types de fichier.
FileHandle doit être instancié dans le cas où on veut charger des fichiers textes ou des fichiers binaires tels que : une image via la classe Texture ou un son via la classe Sound.
Les codes suivant montrent comment obtenir la manipulation d’un fichier :

Fichier interne
FileHandle fichier = Gdx.files.internal("data/fichier.txt");
* Sous desktop : Le répertoire data/ est dans la racine du projet la ou les classes sont situées.
cMais comme nous avons créé notre propre fichier assets pour le projet desktop, il est préférable de le mettre là-dedans.
* Sous Android : Le répertoire date/ doit être dans assets

Fichier Classpath
FileHandle fichier = Gdx.files.classpath("fichier.txt");
Le "fichier.txt" fichier se trouve dans le répertoire du projet qui contient les classes compilées et les fichiers JARs inclus.

Fichier externe :
FileHandle fichier = Gdx.files.external("fichier.txt");
Pour récupérer le fichier fichier.txt :
* Sous desktop : Il doit être dans le dans le répertoire /home/<user>/ sous Linux ou dans le        répertoire /Users/<user> sous Windows.
Remarque : Pour récupérer le répertoire  Home de votre utilisateur
System.getProperty("user.home"));
* Sous Android : Il doit être dans le répertoire racine de la carte SD.

Fichier Absolu :
FileHandle handle = Gdx.files.absolute("/rep1/rep2/rep3/fichier.txt");
Pour récupérer le fichier ficheir.txt, il doit être exactement dans le répertoire indiqué la haut i.e. dans /rep1/rep2/rep3/

Opérations sur les fichiers
Comme je l’ai mentionné un peu plus haut FileHandle nous fournit plusieurs méthodes qui permettent la manipulation des fichiers.

Exemple : vérifier qu’un fichier stocké en externe existe ou non i.e. si la carte SD est-elle insérée ou pas :
boolean existe ;
existe=Gdx.files.external("fichier.txt").exists();

Exemple : vérifie si un fichier  stocké en externe est-il un répertoire ou non :
boolean estUnRepertoire ;
estUnRepertoire = Gdx.files.external("test/").isDirectory();

Exemple : Lister le contenu d’un répertoire stocké en local :
int i =1;
FileHandle[] fichiers = Gdx.files.local("repertoireLocal/").list();
                for(FileHandle file: files) {
                   System.out.println("Le repertoire n°"+i+" "+file.name());
                  i++;
                }
List() renvoi un tableau de FileHandle qui contient les fichiers et les répertoires qui se trouvent juste en dessus.

Exemple : demander le répertoire parent d’un fichier ou d’un répertoire :
FileHandle fichier = Gdx.files.local("D:/Amine/Hamid/").parent();
            System.out.print("Le repertoire :"+fichier.name());
Ici le résultat affiché est évidemment « Amine ».

Exemple : Créer un FileHandle pour un fichier situant dans l’un des répertoires fils du répertoire se situant en interne :
FileHandle fichier = Gdx.files.internal("/data/image/").child("image.png");
            System.out.print("Le repertoire :"+fichier.name());
Child() prend en paramètre le nom de fichier que l’on veut obtenir.

Il y a plein d’autre méthodes pour plus de détails veillez se référencer à la documentation javadocs.

Je vous ai montré toutes les types de fichier, mais d'aurai en avant on s’intéressera que sur les fichiers stockés en interne parce que c’est facile de savoir s’ils existent ou pas, il suffit de visualiser le contenu du fichier assets

Lire et Ecrire dans un fichier :

Lire d'un fichier : c’est très simple.

Exemple : récupérer le contenu d’un fichier dans une chaine de caractère.
FileHandle fichier = Gdx.files.internal("fichier.txt");
    String texte = fichier.readString();

Exemple : récupérer le contenu d’un fichier en binaire
FileHandle fichier = Gdx.files.internal("fichier.bin");
    byte[] bytes = fichier.readBytes();

Sachez qu’il y a plein d’autres méthodes qui traitent la lecture d’un fichier pour plus de renseignement consultez la javadocs.

Ecrire dans un fichier : c’est aussi simple que la lecture mais il faut prendre en considération le type de fichier car comme on l’a déjà dit seuls les fichiers stockés en externe, en local et en absolu tolèrent l’écriture.

Exemple : écrire une chaine de caractère dans un fichier
FileHandle fichier = Gdx.files.local("fichier.txt");
    fichier.writeString("blab la blab", false);

Exemple : écrire des données binaires
FileHandle fichier = Gdx.files.local("fichier.bin");
            fichier.writeBytes(new byte[] { 0, 1, 01, 10 }, false);

Sachez qu’il y a plein d’autres méthodes qui traitent l’écriture des données dans un fichier pour plus de détails consultez javadocs.

Copier, supprimer, renommer, déplacer des fichiers

Ces opérations sont possibles que pour les types de fichier qui tolèrent l’écriture :

Exemple : supprimer un fichier ou un répertoire
Gdx.files.local("fichierLocal.txt").delete();

Exemple : Renommer un fichier
Gdx.files.external("fichierExterne1.txt").rename("fichierExterne2.txt");

Exemple : déplacer un fichier
Gdx.files.external("mycopy.txt").moveTo(Gdx.files.local("mylocalcopy.txt"));

Exemple : Copier un fichier
FileHandle fichierSource = Gdx.files.internal("fichierExterne.txt");
fichierSource.copyTo(Gdx.files.external("laCopyExterne.txt");
           

Conclusion
Dans ce tutoriel, nous avons vu l’utilisation des fichiers à travers les deux plateformes ce qui va nous être très utile dans les prochains chapitres. Si vous avez des remarques ou des questions n’hésitez pas à les poster en commentaire. Merci pour votre lecture.

4 commentaires: