Skip to main content

POO et les fichiers

Fichiers

Il existe plusieurs types de fichiers (textes ou binaires), les fichiers textes sont encodé d'une façon permettant le décodage (UTF-8, ASCII, etc).

Tout fichier est enregistré en binaire sur le disque mais les fichiers textes utilisant un standard ils sont particulièrement facile à décoder, on peut donc dire qu'ils sont très portables.

C'est l'OS (à l'aide du filesystem) qui se charge d'enregistrer les fichiers sur un support physique (SSD, HDD, etc).

Chemins de fichiers

Il existe 2 types de chemins de fichiers, les fichiers absolu et relatifs.

  • Pour les chemin absolu, la racine est le point de départ, commençant généralement par un / ou un \.
  • Sinon ce sont des chemins relatifs qui ont pour point de départ le dossier courrant, cela permet d'avoir une certaine portabilité entre les machines.

Lire un fichier avec Java

La lecture d'un fichier se fait avec un Reader, qui est une classe abstraite. On a donc plusieurs types de Reader différents pour plusieurs buts (BufferedReader, FileReader, StringReader, etc)

FileReader

Le FileReader permet de lire des caractères depuis un fichier et fournit une interface simple de lecture. Le FileReader lit caractère par caractère ce qui nécessite donc beaucoup d'appels I/O (input/output) à l'OS.

Le FileReader gère aussi automatiquement l'encodage du fichier en se basant sur celui de l'OS.

BufferedReader

Le BufferedReader crée un "tampon". Un tampon permet de lire les données par blocs (par exemple ligne par ligne), ce qui permet de faire moins d'appels I/O et une amélioration des performances. Gestion automatique du flux d'entrée

Exemple d'utilisation de FileReader et BufferedReader

String nomFichier = "dossier/fichier.txt";

// Le try-with-resources ici va permettre d'automatiquement fermer le FileReader et BufferedReader
try (BufferedReader lineReader = new BufferedReader(new FileReader(nomFichier))) {
    System.out.println(lineReader.readLine()); // Lecture de la première ligne
} catch (IOException e) {
    e.printStackTrace();
}

Ecrire un fichier en Java

L'écriture d'un fichier en Java se fait avec des Writer, qui est aussi une classe abstraite, il y a donc, tout comme pour les Readers FileWriter, BufferedWriter, etc.

Attention ! à l'ouverture d'un fichier via FileWriter, son contenu sera supprimé sauf si on indique de le garder.

Il faut donc faire attention à ne pas accéder à un même fichier en écriture en même temps car sinon les deux vont sécraser ou créer des données incohérentes. Dans certains logiciels cela est géré avec des fichiers .lock qui sont créés au début de l'écriture. Ainsi on peut vérifier si un fichier .lock existe, et si oui attendre que ce dernier soit supprimé pour écrire.

Dans Java il faut cependant créer ce mécanisme soi-même.

Exemple de l'utilisation de FileWriter et BufferedWriter

String nomFichier = "dossier/fichier.txt";

// Le try-with-resources ici va permettre d'automatiquement fermer le FileWriter et BufferedWriter
// Le "true" dans le FileWriter permet d'activer le mode "append" qui va empécher d'écraser le texte existant, il va donc ajouter les lignes à la suite.
try (BufferedWriter lineWriter = new BufferedWriter(new FileWriter(nomFichier, true))) {
    lineWriter.write("Ceci est une ligne");
    lineWriter.newLine();
    lineWriter.write("Et ceci en est une autre !");
}

Formats de fichiers

Il existe énormément de formats de fichiers différents. Mais on va passer en revue quelques un de ces formats de fichiers textes.

En POO on doit avoir une structure de donnée permettant de pouvoir enregistrer l'états des objets. Cette structure doit être transportable, capable de représenter toutes les structures de la POO et avoir une documentation qui soit complète et accessible.

Pour cela on va donc se baser sur des structures de données standard, dont voici quelques unes :

CSV (Comma Separated Values)

Les fichiers CSV sont des fichiers "tableaux" où chaque ligne est une ligne et où chaque donnée de chaque ligne est séparé par une virgule.

Exemple

Nom,Prénom,Age,Ville
Doe,John,30,New York
Smith,Jane,28,San Francisco

Avantages

Il a l'avantage d'être très simple à faire, décoder et comprendre.

Inconvénient

Il est un peu trop simple, il peut permettre de stoquer une liste d'objet avec des attributs simples. Par contre, il est difficile de stoquer une sous-liste dans le CSV.

XML (Extensible Markup Langage)

Le XML est un lagage de balisage (par exemple le HTML). Il est dit "extensible" par il permet de définir différentes balises personalisées (comme si on créait notre propre langage). Ce langage est reconnaissable par son usage des chevrons <> pour encadrer les balises.

Il est très bien pour représenter des contenu complexes comme des arbres, du texte riche, etc.

Il permet de stoquer, transférer ou afficher les données.

Le XML a tout de même quelques règles :

  • Les balises doivent être correctement imbriquées
  • Le nom d'une balises ne doivent être que en majuscules ou minuscules, éviter les carctères spéciaux et les espaces sont interdit

Exemple

<Etudiants>
    <Etudiant>
        <Nom>Doe</Nom>
        <Prénom>John</Prénom>
        <Age>30</Age>
        <Ville>New York</Ville>
    </Etudiant>
    <Etudiant>
        <Nom>Smith</Nom>
        <Prénom>Jane</Prénom>
        <Age>28</Age>
        <Ville>San Francisco</Ville>
    </Etudiant>
    <Etudiant>
        <Nom>Johnson</Nom>
        <Prénom>Robert</Prénom>
        <Age>35</Age>
        <Ville>Los Angeles</Ville>
    </Etudiant>
</Etudiants>

Avantages

  • XML est un vrai standard
  • XML est plus "verbeux"
  • Des structures plus complexes

Inconvénients

  • XML est peut'être parfois trop verbeux
  • XML est parfois un peu trop complexe pour beaucoup d'utilisations

JSON (JavaScript Object Notation)

Le but du JSON est surtout une structure simple composée d'ensembles de clés-valeurs ou liste de valeurs.

Le JSON propose plusieurs types :

  • Chaine de caractère
  • Booléen
  • Tableau
  • Nombre
  • null

Exemple

{
    "etudiants":
        [
            {
                "nom": "Doe",
                "prenom": "John",
                "age": 20,
                "ville": "New York",
                "notes": [85.5, 90.0, 78.2]
            },
            {
                "nom": "Smith",
                "prenom": "Jane",
                "age": 22,
                "ville": "San Francisco",
                "notes": [92.3, 88.8, 75.9]
            }
        ]
}

Avantages

  • Permet de représenter n'importe quelles données
  • Facile à implémenter et standardisé
  • Moins verbeux que le XML

Inconvénients

  • Pas de commentaires
  • Un seul type de nombre (float)
  • Pas de type date
  • Peu lisible si beaucoup de données

YAML (YAML Ain't a Markup Langage)

YAML est un format de fichier permettant d'être plus lisible pour les humains, c'est pourquoi il est beaucoup utilisé comme fichier de configuration.

C'est un format qui a une notatino plus simplifie par rapport au JSON. Les listes sont reconnaissables par l'utilisation du - tandis que les objets n'en ont pas.

Exemple

etudiants:
    - nom: Doe
      prenom: John
      age: 20
      ville: New York
      notes:
          - 85.5
          - 90.0
          - 78.2
    - nom: Smith
      prenom: Jane
      age: 22
      ville: San Francisco
      notes:
          - 92.3
          - 88.8
          - 75.9

Avantages

  • Facile à utiliser dans tous les langages de programmation
  • A les float et int
  • Peut représenter n'importe quelle données
  • Les commentaires existent

Désavantages

  • Pas de types dates
  • Peu lisible du au manque de structure