Section 1 : Questions Approfondies

  1. Expliquez la différence entre FileInputStream et FileOutputStream. Quand les utiliseriez-vous chacun ?
  2. Comment Java gère-t-il les tampons (buffers) dans les opérations d'I/O ? Expliquez le rôle du BufferedInputStream et du BufferedOutputStream.
  3. Dans quelles situations utiliseriez-vous ObjectInputStream et ObjectOutputStream ? Donnez un exemple d'utilisation.
  4. Décrivez le processus de sérialisation et de désérialisation en Java. Comment la classe Serializable est-elle utilisée dans ce contexte ?
  5. Expliquez la différence entre la gestion des fichiers binaires et des fichiers texte en Java. Quels sont les avantages et inconvénients de chaque approche ?
  6. Comment la classe Files du package java.nio.file diffère-t-elle des classes des anciens packages I/O comme FileReader et FileWriter ?
  7. Quelles sont les implications de la manipulation de grands fichiers (plusieurs gigaoctets) en Java, et comment pouvez-vous optimiser leur lecture/écriture ?
  8. Expliquez la différence entre une lecture/écriture synchrone et asynchrone. Comment Java gère-t-il l'I/O asynchrone, et dans quelles situations serait-ce approprié ?
  9. Comment les exceptions d'entrées/sorties en Java (telles que IOException et FileNotFoundException) sont-elles liées à la gestion des ressources du système ? Pourquoi est-il essentiel de les gérer correctement ?
  10. Qu'est-ce que le canal I/O (java.nio.channels.FileChannel) et comment fonctionne-t-il ? Quels sont ses avantages comparés aux flux traditionnels (Streams) ?

Section 2 : Analyse d'un Code Java Complexe

Analysez le code suivant, qui lit et écrit des objets sérialisés, et répondez aux questions :

import java.io.*;

class Person implements Serializable {
    private static final long serialVersionUID = 1L;
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String toString() {
        return "Name: " + name + ", Age: " + age;
    }
}

public class SerializationExample {
    public static void main(String[] args) {
        String filename = "people.ser";

        // Serialization
        try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(filename))) {
            oos.writeObject(new Person("Alice", 30));
            oos.writeObject(new Person("Bob", 25));
        } catch (IOException e) {
            System.out.println("Serialization error: " + e.getMessage());
        }

        // Deserialization
        try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(filename))) {
            Person person1 = (Person) ois.readObject();
            Person person2 = (Person) ois.readObject();
            System.out.println(person1);
            System.out.println(person2);
        } catch (IOException | ClassNotFoundException e) {
            System.out.println("Deserialization error: " + e.getMessage());
        }
    }
}
  1. Que fait ce programme en général ?
  2. Pourquoi la classe Person doit-elle implémenter l'interface Serializable ?
  3. Que fait la méthode writeObject() dans ce code ?
  4. Expliquez ce que représente l'attribut serialVersionUID et pourquoi il est important dans ce code.
  5. Qu'arrive-t-il si vous ne fournissez pas de serialVersionUID dans une classe Serializable ?
  6. Pourquoi utilisons-nous des flux d'objets (ObjectOutputStream et ObjectInputStream) pour sérialiser et désérialiser des objets ?
  7. Que se passe-t-il si la classe Person est modifiée après que des objets ont été sérialisés ?
  8. Expliquez ce qu'est la méthode readObject() et son rôle dans le processus de désérialisation.
  9. Que se passerait-il si un fichier invalide est lu avec la méthode readObject() ?
  10. Comment amélioreriez-vous ce programme pour gérer un plus grand nombre d'objets de manière efficace (ex : utiliser des collections) ?

Section 3 : Écriture d'un Code Java Avancé

  1. Écrivez un programme Java qui lit un fichier texte et génère un fichier avec uniquement les lignes qui contiennent un mot-clé spécifique donné par l'utilisateur.
  2. Créez un programme Java qui divise un fichier texte en plusieurs fichiers plus petits, chaque fichier ayant un nombre donné de lignes.
  3. Écrivez un programme Java qui lit un fichier CSV contenant des informations sur des produits (nom, prix, quantité) et génère un fichier récapitulatif avec le total des prix et quantités.
  4. Modifiez le programme précédent pour qu'il prenne en charge des fichiers CSV avec des valeurs manquantes (en les ignorant ou en affichant un avertissement).
  5. Écrivez un programme Java qui compare le contenu de deux fichiers texte et affiche les différences ligne par ligne (similaire à la commande diff en Unix).
  6. Créez un programme Java qui lit un fichier texte et calcule la fréquence d'apparition de chaque mot dans le fichier. Affichez les résultats dans l'ordre décroissant de fréquence.
  7. Écrivez un programme Java qui utilise les NIO (New I/O) pour lire et écrire dans des fichiers en utilisant les classes Path et Files.

CORRECTION :

 

Rappels de Fonctions Utiles en Java

1. Classes pour la gestion des fichiers

  • File : Représente un chemin de fichier ou de répertoire.
    • exists() : Vérifie si le fichier ou répertoire existe.
    • createNewFile() : Crée un nouveau fichier.
    • mkdir() / mkdirs() : Crée un répertoire unique / plusieurs répertoires.
    • delete() : Supprime un fichier ou un répertoire.
  • FileInputStream : Lit les octets d'un fichier.
    • read() : Lit un octet du fichier.
    • read(byte[] b) : Lit les octets dans un tableau.
  • FileOutputStream : Écrit des octets dans un fichier.
    • write(int b) : Écrit un octet dans le fichier.
    • write(byte[] b) : Écrit un tableau d'octets dans le fichier.

2. Sérialisation et désérialisation

  • Serializable : Interface qui marque une classe comme étant sérialisable.
  • ObjectOutputStream : Écrit des objets sérialisés dans un fichier ou un flux.
    • writeObject(Object obj) : Sérialise et écrit l'objet `obj` dans le flux.
  • ObjectInputStream : Lit des objets sérialisés à partir d'un fichier ou flux.
    • readObject() : Désérialise et retourne l'objet lu à partir du flux.

3. Classes pour la lecture et l'écriture de fichiers texte

  • FileReader : Lit des caractères d'un fichier texte.
    • read() : Lit un seul caractère.
    • read(char[] cbuf) : Lit des caractères dans un tableau de caractères.
  • FileWriter : Écrit des caractères dans un fichier texte.
    • write(String str) : Écrit une chaîne de caractères dans le fichier.
    • write(char[] cbuf) : Écrit un tableau de caractères dans le fichier.
  • BufferedReader : Permet de lire du texte de manière plus efficace (avec un tampon).
    • readLine() : Lit une ligne entière de texte.
  • BufferedWriter : Permet d'écrire du texte de manière plus efficace (avec un tampon).
    • write(String str) : Écrit une chaîne de caractères dans le fichier avec un tampon.

4. Gestion des exceptions d'I/O

  • IOException : Exception de base pour les erreurs d'entrée/sortie.
  • FileNotFoundException : Exception levée lorsque le fichier est introuvable.
  • EOFException : Exception levée lorsqu'on atteint la fin d'un fichier.

5. Gestion des tampons (buffers)

  • BufferedInputStream : Lit des octets à partir d'un flux d'entrée avec un tampon.
    • read() : Lit un octet du flux avec tampon.
  • BufferedOutputStream : Écrit des octets dans un flux de sortie avec un tampon.
    • write(int b) : Écrit un octet dans le flux avec tampon.

6. Classes avancées pour la manipulation de fichiers

  • Files (package java.nio.file) : Classe utilitaire pour la manipulation de fichiers.
    • readAllBytes(Path path) : Lit tous les octets d'un fichier.
    • write(Path path, byte[] bytes) : Écrit des octets dans un fichier.
    • copy(Path source, Path target) : Copie un fichier.
    • move(Path source, Path target) : Déplace ou renomme un fichier.
  • Paths : Classe utilitaire pour créer des objets Path à partir de chaînes de caractères.
    • get(String first, String... more) : Crée un objet Path.

7. Opérations asynchrones et multithreading avec les fichiers

  • Thread : Classe de base pour créer et gérer des threads en Java.
    • start() : Démarre l'exécution d'un thread.
  • Callable<V> : Interface pour créer des threads qui renvoient un résultat.
    • call() : Méthode exécutée par un thread Callable qui retourne un résultat.
  • ExecutorService : Interface pour gérer des pools de threads.
    • submit(Callable<V> task) : Soumet une tâche pour exécution par un pool de threads.
    • shutdown() : Termine l'exécution des threads du pool.

8. Gestion des canaux I/O (Channels)

  • FileChannel : Classe pour gérer les entrées/sorties de fichiers de manière plus efficace (utilisée dans java.nio).
    • open(Path path, OpenOption... options) : Ouvre un fichier pour lecture/écriture avec les options spécifiées.
    • read(ByteBuffer dst) : Lit les données dans un tampon ByteBuffer.
    • write(ByteBuffer src) : Écrit les données du tampon dans un fichier.

9. Autres classes utiles

  • Scanner : Classe pour lire des entrées (comme des fichiers texte ou des entrées clavier).
    • nextLine() : Lit une ligne de texte.
    • nextInt() : Lit un entier à partir de l'entrée.
  • PrintWriter : Classe pour écrire des chaînes de caractères dans des fichiers ou d'autres sorties.
    • print() et println() : Écrit des données avec ou sans retour à la ligne.

 

 

Si vous avez trouvé les exercices corrigés en Java de Mr JoëlYk intéressants et utiles, pourquoi ne pas les partager avec d'autres personnes qui pourraient également en bénéficier ? Partagez ce lien sur les réseaux sociaux ou envoyez-le à vos amis et collègues. Vous pourriez aider quelqu'un à améliorer ses compétences en programmation ou à trouver des solutions à des problèmes complexes. N'oubliez pas que la connaissance doit être partagée pour grandir. Merci pour votre soutien et votre partage !

Contact WhatsApp : +237 652027193 | Réaliser Par Joël_Yk

Exercices de Manipulation des Flux en Java
Aucune note. Soyez le premier à attribuer une note !

Ajouter un commentaire

Anti-spam