Section 1 : Questions Approfondies
- Expliquez la différence entre
FileInputStream
et FileOutputStream
. Quand les utiliseriez-vous chacun ?
- 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
.
- Dans quelles situations utiliseriez-vous
ObjectInputStream
et ObjectOutputStream
? Donnez un exemple d'utilisation.
- 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 ?
- 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 ?
- Comment la classe
Files
du package java.nio.file
diffère-t-elle des classes des anciens packages I/O comme FileReader
et FileWriter
?
- Quelles sont les implications de la manipulation de grands fichiers (plusieurs gigaoctets) en Java, et comment pouvez-vous optimiser leur lecture/écriture ?
- 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é ?
- 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 ?
- 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());
}
}
}
- Que fait ce programme en général ?
- Pourquoi la classe
Person
doit-elle implémenter l'interface Serializable
?
- Que fait la méthode
writeObject()
dans ce code ?
- Expliquez ce que représente l'attribut
serialVersionUID
et pourquoi il est important dans ce code.
- Qu'arrive-t-il si vous ne fournissez pas de
serialVersionUID
dans une classe Serializable
?
- Pourquoi utilisons-nous des flux d'objets (
ObjectOutputStream
et ObjectInputStream
) pour sérialiser et désérialiser des objets ?
- Que se passe-t-il si la classe
Person
est modifiée après que des objets ont été sérialisés ?
- Expliquez ce qu'est la méthode
readObject()
et son rôle dans le processus de désérialisation.
- Que se passerait-il si un fichier invalide est lu avec la méthode
readObject()
?
- 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é
- É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.
- Créez un programme Java qui divise un fichier texte en plusieurs fichiers plus petits, chaque fichier ayant un nombre donné de lignes.
- É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.
- 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).
- É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).
- 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.
- É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
.